diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 8375411..ccaf338 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -251,6 +251,8 @@
 
   IncrementalKernelTarget? get kernelTargetForTesting => _lastGoodKernelTarget;
 
+  bool get skipExperimentalInvalidationChecksForTesting => false;
+
   /// Returns the [Package] used for the package [packageName] in the most
   /// recent compilation.
   Package? getPackageForPackageName(String packageName) =>
@@ -1245,52 +1247,54 @@
     // procedures, if the changed file is used as a mixin anywhere else
     // we can't only recompile the changed file.
     // TODO(jensj): Check for mixins in a smarter and faster way.
-    for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
-      if (missingSources!.contains(builder.fileUri)) {
-        continue;
-      }
-      Library lib = builder.library;
-      for (Class c in lib.classes) {
-        if (!c.isAnonymousMixin && !c.isEliminatedMixin) {
+    if (!skipExperimentalInvalidationChecksForTesting) {
+      for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
+        if (missingSources!.contains(builder.fileUri)) {
           continue;
         }
-        for (Supertype supertype in c.implementedTypes) {
-          if (missingSources.contains(supertype.classNode.fileUri)) {
-            // This is probably a mixin from one of the libraries we want
-            // to rebuild only the body of.
-            // TODO(jensj): We can probably add this to the rebuildBodies
-            // list and just rebuild that library too.
-            // print("Usage of mixin in ${lib.importUri}");
-            return null;
+        Library lib = builder.library;
+        for (Class c in lib.classes) {
+          if (!c.isAnonymousMixin && !c.isEliminatedMixin) {
+            continue;
+          }
+          for (Supertype supertype in c.implementedTypes) {
+            if (missingSources.contains(supertype.classNode.fileUri)) {
+              // This is probably a mixin from one of the libraries we want
+              // to rebuild only the body of.
+              // TODO(jensj): We can probably add this to the rebuildBodies
+              // list and just rebuild that library too.
+              // print("Usage of mixin in ${lib.importUri}");
+              return null;
+            }
           }
         }
       }
-    }
 
-    // Special case FFI: Because the VM ffi transformation inlines
-    // size and position, if the changed file contains ffi structs
-    // we can't only recompile the changed file.
-    // TODO(jensj): Come up with something smarter for this. E.g. we might
-    // check if the FFI-classes are used in other libraries, or as actual nested
-    // structures in other FFI-classes etc.
-    // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
-    // do something else entirely that doesn't require special handling.
-    if (_importsFfi()) {
-      for (LibraryBuilder builder in rebuildBodies!) {
-        Library lib = builder.library;
-        for (LibraryDependency dependency in lib.dependencies) {
-          Library importLibrary = dependency.targetLibrary;
-          if (importLibrary.importUri == dartFfiUri) {
-            // Explicitly imports dart:ffi.
-            return null;
-          }
-          for (Reference exportReference in importLibrary.additionalExports) {
-            NamedNode? export = exportReference.node;
-            if (export is Class) {
-              Class c = export;
-              if (c.enclosingLibrary.importUri == dartFfiUri) {
-                // Implicitly imports a dart:ffi class.
-                return null;
+      // Special case FFI: Because the VM ffi transformation inlines
+      // size and position, if the changed file contains ffi structs
+      // we can't only recompile the changed file.
+      // TODO(jensj): Come up with something smarter for this. E.g. we might
+      // check if the FFI-classes are used in other libraries, or as actual
+      // nested structures in other FFI-classes etc.
+      // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
+      // do something else entirely that doesn't require special handling.
+      if (_importsFfi()) {
+        for (LibraryBuilder builder in rebuildBodies!) {
+          Library lib = builder.library;
+          for (LibraryDependency dependency in lib.dependencies) {
+            Library importLibrary = dependency.targetLibrary;
+            if (importLibrary.importUri == dartFfiUri) {
+              // Explicitly imports dart:ffi.
+              return null;
+            }
+            for (Reference exportReference in importLibrary.additionalExports) {
+              NamedNode? export = exportReference.node;
+              if (export is Class) {
+                Class c = export;
+                if (c.enclosingLibrary.importUri == dartFfiUri) {
+                  // Implicitly imports a dart:ffi class.
+                  return null;
+                }
               }
             }
           }
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index e177ba8..b18526f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -2,8 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:_fe_analyzer_shared/src/macros/executor.dart' as macro;
 import 'package:_fe_analyzer_shared/src/messages/codes.dart';
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
+import 'package:_fe_analyzer_shared/src/parser/quote.dart';
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 
@@ -15,7 +17,6 @@
 import '../../scope.dart';
 import '../../source/diet_parser.dart';
 import '../../source/source_library_builder.dart';
-
 import 'macro.dart';
 
 List<MacroApplication>? prebuildAnnotations(
@@ -78,7 +79,35 @@
 }
 
 class _ArgumentsNode implements _Node {
-  _ArgumentsNode();
+  final List<Object?> positionalArguments;
+  final Map<String, Object?> namedArguments;
+
+  _ArgumentsNode(this.positionalArguments, this.namedArguments);
+}
+
+class _PrimitiveValueNode implements _Node {
+  final Object? value;
+
+  _PrimitiveValueNode(this.value);
+}
+
+class _TokenNode implements _Node {
+  final Token token;
+
+  _TokenNode(this.token);
+}
+
+class _NamedArgumentIdentifierNode implements _Node {
+  final String name;
+
+  _NamedArgumentIdentifierNode(this.name);
+}
+
+class _NamedArgumentNode implements _Node {
+  final String name;
+  final Object? value;
+
+  _NamedArgumentNode(this.name, this.value);
 }
 
 class _MacroListener implements Listener {
@@ -154,8 +183,11 @@
       if (macroClass != null &&
           constructorName != null &&
           argumentsNode is _ArgumentsNode) {
-        push(new _MacroApplicationNode(
-            new MacroApplication(macroClass, constructorName)));
+        push(new _MacroApplicationNode(new MacroApplication(
+            macroClass,
+            constructorName,
+            new macro.Arguments(argumentsNode.positionalArguments,
+                argumentsNode.namedArguments))));
         return;
       }
     }
@@ -211,6 +243,9 @@
           pushUnsupported();
         }
         break;
+      case IdentifierContext.namedArgumentReference:
+        push(new _NamedArgumentIdentifierNode(token.lexeme));
+        break;
       default:
         pushUnsupported();
         break;
@@ -224,11 +259,27 @@
 
   @override
   void endArguments(int count, Token beginToken, Token endToken) {
-    if (count == 0) {
-      push(new _ArgumentsNode());
-    } else {
-      // TODO(johnniwinther): Handle arguments.
+    if (unrecognized) {
       pushUnsupported();
+      return;
+    }
+    List<Object?> positionalArguments = [];
+    Map<String, Object?> namedArguments = {};
+    for (int i = 0; i < count; i++) {
+      _Node node = pop();
+      if (node is _PrimitiveValueNode) {
+        positionalArguments.add(node.value);
+      } else if (node is _NamedArgumentNode &&
+          !namedArguments.containsKey(node.name)) {
+        namedArguments[node.name] = node.value;
+      } else {
+        _unsupported();
+      }
+    }
+    if (unrecognized) {
+      pushUnsupported();
+    } else {
+      push(new _ArgumentsNode(positionalArguments, namedArguments));
     }
   }
 
@@ -248,6 +299,99 @@
     // context.
   }
 
+  @override
+  void handleNamedArgument(Token colon) {
+    if (unrecognized) {
+      pushUnsupported();
+    } else {
+      _Node value = pop();
+      _Node name = pop();
+      if (name is _NamedArgumentIdentifierNode &&
+          value is _PrimitiveValueNode) {
+        push(new _NamedArgumentNode(name.name, value.value));
+      } else {
+        pushUnsupported();
+      }
+    }
+  }
+
+  @override
+  void handleLiteralNull(Token token) {
+    push(new _PrimitiveValueNode(null));
+  }
+
+  @override
+  void handleLiteralBool(Token token) {
+    push(new _PrimitiveValueNode(token.lexeme == 'true'));
+  }
+
+  @override
+  void handleLiteralDouble(Token token) {
+    push(new _PrimitiveValueNode(double.parse(token.lexeme)));
+  }
+
+  @override
+  void handleLiteralInt(Token token) {
+    push(new _PrimitiveValueNode(int.parse(token.lexeme)));
+  }
+
+  @override
+  void beginLiteralString(Token token) {
+    push(new _TokenNode(token));
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    if (unrecognized) {
+      pushUnsupported();
+      return;
+    }
+    if (interpolationCount == 0) {
+      _Node node = pop();
+      if (node is _TokenNode) {
+        String text = unescapeString(node.token.lexeme, node.token, this);
+        if (unrecognized) {
+          pushUnsupported();
+        } else {
+          push(new _PrimitiveValueNode(text));
+        }
+      } else {
+        pushUnsupported();
+      }
+    } else {
+      // TODO(johnniwinther): Should we support this?
+      pushUnsupported();
+    }
+  }
+
+  @override
+  void handleStringPart(Token token) {
+    // TODO(johnniwinther): Should we support this?
+    _unhandled();
+  }
+
+  @override
+  void handleStringJuxtaposition(Token startToken, int literalCount) {
+    if (unrecognized) {
+      pushUnsupported();
+    } else {
+      List<String> values = [];
+      for (int i = 0; i < literalCount; i++) {
+        _Node node = pop();
+        if (node is _PrimitiveValueNode && node.value is String) {
+          values.add(node.value as String);
+        } else {
+          _unsupported();
+        }
+      }
+      if (unrecognized) {
+        pushUnsupported();
+      } else {
+        push(new _PrimitiveValueNode(values.reversed.join()));
+      }
+    }
+  }
+
   //////////////////////////////////////////////////////////////////////////////
   // Stub implementation
   //////////////////////////////////////////////////////////////////////////////
@@ -553,11 +697,6 @@
   }
 
   @override
-  void beginLiteralString(Token token) {
-    _unhandled();
-  }
-
-  @override
   void beginLiteralSymbol(Token token) {
     _unhandled();
   }
@@ -1126,11 +1265,6 @@
   }
 
   @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    _unhandled();
-  }
-
-  @override
   void endLiteralSymbol(Token hashToken, int identifierCount) {
     _unhandled();
   }
@@ -1637,21 +1771,6 @@
   }
 
   @override
-  void handleLiteralBool(Token token) {
-    _unhandled();
-  }
-
-  @override
-  void handleLiteralDouble(Token token) {
-    _unhandled();
-  }
-
-  @override
-  void handleLiteralInt(Token token) {
-    _unhandled();
-  }
-
-  @override
   void handleLiteralList(
       int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     _unhandled();
@@ -1663,11 +1782,6 @@
   }
 
   @override
-  void handleLiteralNull(Token token) {
-    _unhandled();
-  }
-
-  @override
   void handleLiteralSetOrMap(int count, Token leftBrace, Token? constKeyword,
       Token rightBrace, bool hasSetEntry) {
     _unhandled();
@@ -1684,11 +1798,6 @@
   }
 
   @override
-  void handleNamedArgument(Token colon) {
-    _unhandled();
-  }
-
-  @override
   void handleNamedMixinApplicationWithClause(Token withKeyword) {
     _unexpected();
   }
@@ -1840,16 +1949,6 @@
   }
 
   @override
-  void handleStringJuxtaposition(Token startToken, int literalCount) {
-    _unhandled();
-  }
-
-  @override
-  void handleStringPart(Token token) {
-    _unhandled();
-  }
-
-  @override
   void handleSuperExpression(Token token, IdentifierContext context) {
     _unsupported();
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
index 9d67f00..18a3e34 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -65,10 +65,11 @@
 class MacroApplication {
   final ClassBuilder classBuilder;
   final String constructorName;
+  final macro.Arguments arguments;
 
   // TODO(johnniwinther): Add support for arguments.
 
-  MacroApplication(this.classBuilder, this.constructorName);
+  MacroApplication(this.classBuilder, this.constructorName, this.arguments);
 
   late macro.MacroInstanceIdentifier instanceIdentifier;
 
@@ -152,8 +153,7 @@
                       libraryUri,
                       macroClassName,
                       application.constructorName,
-                      // TODO(johnniwinther): Support macro arguments.
-                      new macro.Arguments([], {}));
+                      application.arguments);
               benchmarker?.endSubdivide();
             } catch (e) {
               throw "Error instantiating macro `${application}`: $e";
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index 8194d15..203dcd4 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -24,6 +24,8 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
+import '../fasta_codes.dart' show codeNativeClauseShouldBeAnnotation;
+
 import '../messages.dart' show Message;
 
 abstract class _Chunk implements Comparable<_Chunk> {
@@ -884,6 +886,10 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
+    // We ignore this message, as done by stack_listener.dart.
+    if (message.code == codeNativeClauseShouldBeAnnotation) {
+      return;
+    }
     gotError = true;
   }
 }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index c2ab5a9..498d457 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -117,6 +117,8 @@
         StdioProcess;
 import 'package:vm/target/vm.dart' show VmTarget;
 
+import '../../incremental_suite.dart' show TestRecorderForTesting;
+
 import '../../testing_utils.dart' show checkEnvironment;
 import '../../utils/kernel_chain.dart'
     show
@@ -176,6 +178,10 @@
     "group": "Fail"
   },
   {
+    "name": "semiFuzzFailureOnForceRebuildBodies",
+    "group": "Fail"
+  },
+  {
     "name": "SemiFuzzCrash",
     "group": "Fail"
   }
@@ -221,6 +227,8 @@
 final ExpectationSet staticExpectationSet =
     new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
 final Expectation semiFuzzFailure = staticExpectationSet["SemiFuzzFailure"];
+final Expectation semiFuzzFailureOnForceRebuildBodies =
+    staticExpectationSet["semiFuzzFailureOnForceRebuildBodies"];
 final Expectation semiFuzzCrash = staticExpectationSet["SemiFuzzCrash"];
 
 /// Options used for all tests within a given folder.
@@ -701,9 +709,11 @@
     // If not semi-fuzzing we can't get semi-fuzz errors.
     if (!semiFuzz &&
         (outcomes.contains(semiFuzzFailure) ||
+            outcomes.contains(semiFuzzFailureOnForceRebuildBodies) ||
             outcomes.contains(semiFuzzCrash))) {
       result ??= new Set.from(outcomes);
       result.remove(semiFuzzFailure);
+      result.remove(semiFuzzFailureOnForceRebuildBodies);
       result.remove(semiFuzzCrash);
     }
 
@@ -1157,20 +1167,71 @@
 
     Component platform =
         context.loadPlatform(backendTarget, compilationSetup.options.nnbdMode);
-    Result<ComponentResult>? passResult = await performFileInvalidation(
+
+    final bool hasErrors;
+    {
+      bool foundErrors = false;
+      if ((result.component.problemsAsJson?.length ?? 0) > 0) {
+        foundErrors = true;
+      } else {
+        for (Library library in result.component.libraries) {
+          if ((library.problemsAsJson?.length ?? 0) > 0) {
+            foundErrors = true;
+            break;
+          }
+        }
+      }
+      hasErrors = foundErrors;
+    }
+
+    try {
+      Result<ComponentResult>? passResult = await performFileInvalidation(
+        compilationSetup,
+        platform,
+        uriTranslator,
+        context,
+        originalCompilationResult: result,
+        forceAndCheckRebuildBodiesOnly: false,
+      );
+      if (passResult != null) return passResult;
+
+      passResult = await performChunkReordering(
         compilationSetup,
         platform,
         uriTranslator,
         result,
         context,
-        originalFlag);
-    if (passResult != null) return passResult;
+      );
+      if (passResult != null) return passResult;
 
-    passResult = await performChunkReordering(compilationSetup, platform,
-        uriTranslator, result, context, originalFlag);
-    if (passResult != null) return passResult;
+      if (!hasErrors) {
+        // To get proper splitting (between dill and not dill builders) we need
+        // experimental invalidation - it doesn't work when there's errors
+        // though, so skip those up front.
+        // Note also that because of splitting and privacy this might fail with
+        // an error --- so it should probably be the last one. At some point we
+        // might swallow that so we can continue, but for now it will be good
+        // to know when it's not run because of that.
+        passResult = await performFileSplitting(
+          compilationSetup,
+          platform,
+          uriTranslator,
+          result,
+          context,
+        );
+        if (passResult != null) return passResult;
+      }
 
-    return pass(result);
+      return pass(result);
+    } finally {
+      if (originalFlag != null) {
+        context.explicitExperimentalFlags[
+            ExperimentalFlag.alternativeInvalidationStrategy] = originalFlag;
+      } else {
+        context.explicitExperimentalFlags
+            .remove(ExperimentalFlag.alternativeInvalidationStrategy);
+      }
+    }
   }
 
   /// Perform a number of compilations where each user-file is invalidated
@@ -1181,51 +1242,87 @@
       CompilationSetup compilationSetup,
       Component platform,
       UriTranslator uriTranslator,
-      ComponentResult result,
       FastaContext context,
-      bool? originalFlag) async {
+      {ComponentResult? originalCompilationResult,
+      required bool forceAndCheckRebuildBodiesOnly}) async {
     compilationSetup.errors.clear();
-    IncrementalCompiler incrementalCompiler =
-        new IncrementalCompiler.fromComponent(
+    SemiForceExperimentalInvalidationIncrementalCompiler incrementalCompiler =
+        new SemiForceExperimentalInvalidationIncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
+    incrementalCompiler.skipExperimentalInvalidationChecksForTesting =
+        forceAndCheckRebuildBodiesOnly;
     IncrementalCompilerResult incrementalCompilerResult =
         await incrementalCompiler.computeDelta();
     final Component component = incrementalCompilerResult.component;
+    print("Compiled and got ${component.libraries.length} libs");
     if (!canSerialize(component)) {
-      return new Result<ComponentResult>(result, semiFuzzFailure,
-          "Couldn't serialize initial component for fuzzing");
+      return new Result<ComponentResult>(originalCompilationResult,
+          semiFuzzFailure, "Couldn't serialize initial component for fuzzing");
     }
 
     final Set<Uri> userLibraries =
         createUserLibrariesImportUriSet(component, uriTranslator);
     final bool expectErrors = compilationSetup.errors.isNotEmpty;
+
+    if (expectErrors && forceAndCheckRebuildBodiesOnly) {
+      return new Result<ComponentResult>(
+          originalCompilationResult,
+          semiFuzzFailureOnForceRebuildBodies,
+          "Errors upon compilation not compatible "
+          "with forcing rebuild bodies. Got ${compilationSetup.errors}");
+    }
+
     List<Iterable<String>> originalErrors =
         new List<Iterable<String>>.from(compilationSetup.errors);
 
-    Set<Uri> intersectionUserLibraries =
-        result.userLibraries.intersection(userLibraries);
-    if (intersectionUserLibraries.length != userLibraries.length ||
-        userLibraries.length != result.userLibraries.length) {
-      return new Result<ComponentResult>(
-          result,
-          semiFuzzFailure,
-          "Got a different amount of user libraries on first compile "
-          "compared to 'original' compilation:\n\n"
-          "This compile:\n"
-          "${userLibraries.map((e) => e.toString()).join("\n")}\n\n"
-          "Original compile:\n"
-          "${result.userLibraries.map((e) => e.toString()).join("\n")}");
+    if (originalCompilationResult != null) {
+      Set<Uri> intersectionUserLibraries =
+          originalCompilationResult.userLibraries.intersection(userLibraries);
+      if (intersectionUserLibraries.length != userLibraries.length ||
+          userLibraries.length !=
+              originalCompilationResult.userLibraries.length) {
+        String originalCompileString = originalCompilationResult.userLibraries
+            .map((e) => e.toString())
+            .join("\n");
+        return new Result<ComponentResult>(
+            originalCompilationResult,
+            semiFuzzFailure,
+            "Got a different amount of user libraries on first compile "
+            "compared to 'original' compilation:\n\n"
+            "This compile:\n"
+            "${userLibraries.map((e) => e.toString()).join("\n")}\n\n"
+            "Original compile:\n"
+            "$originalCompileString");
+      }
     }
 
     compilationSetup.errors.clear();
     for (Uri importUri in userLibraries) {
+      print(" -> invalidating $importUri");
       incrementalCompiler.invalidate(importUri);
-      final IncrementalCompilerResult newResult =
-          await incrementalCompiler.computeDelta(fullComponent: true);
-      final Component newComponent = newResult.component;
-      if (!canSerialize(newComponent)) {
+      final IncrementalCompilerResult newResult;
+      try {
+        newResult = await incrementalCompiler.computeDelta(fullComponent: true);
+      } catch (e, st) {
         return new Result<ComponentResult>(
-            result, semiFuzzFailure, "Couldn't serialize fuzzed component");
+            originalCompilationResult,
+            semiFuzzCrash,
+            "Crashed with '$e' on recompilation after invalidating "
+            "'$importUri'.\n\n$st");
+      }
+      if (forceAndCheckRebuildBodiesOnly) {
+        bool didRebuildBodiesOnly =
+            incrementalCompiler.recorderForTesting.rebuildBodiesCount! > 0;
+        if (!didRebuildBodiesOnly) {
+          return new Result<ComponentResult>(originalCompilationResult,
+              semiFuzzFailure, "Didn't rebuild bodies only!");
+        }
+      }
+      final Component newComponent = newResult.component;
+      print(" -> and got ${newComponent.libraries.length} libs");
+      if (!canSerialize(newComponent)) {
+        return new Result<ComponentResult>(originalCompilationResult,
+            semiFuzzFailure, "Couldn't serialize fuzzed component");
       }
 
       final Set<Uri> newUserLibraries =
@@ -1237,7 +1334,7 @@
           String errorsString =
               originalErrors.map((error) => error.join('\n')).join('\n\n');
           return new Result<ComponentResult>(
-              result,
+              originalCompilationResult,
               semiFuzzFailure,
               "Expected these errors:\n${errorsString}\n\n"
               "but didn't get any after invalidating $importUri");
@@ -1246,7 +1343,7 @@
               .map((error) => error.join('\n'))
               .join('\n\n');
           return new Result<ComponentResult>(
-              result,
+              originalCompilationResult,
               semiFuzzFailure,
               "Unexpected errors:\n${errorsString}\n\n"
               "after invalidating $importUri");
@@ -1257,27 +1354,25 @@
           userLibraries.intersection(newUserLibraries);
       if (intersectionUserLibraries.length != newUserLibraries.length ||
           newUserLibraries.length != userLibraries.length) {
+        String originalCompileString = "";
+        if (originalCompilationResult != null) {
+          originalCompileString = "Original compile:\n" +
+              originalCompilationResult.userLibraries
+                  .map((e) => e.toString())
+                  .join("\n");
+        }
         return new Result<ComponentResult>(
-            result,
+            originalCompilationResult,
             semiFuzzFailure,
             "Got a different amount of user libraries on recompile "
             "compared to 'original' compilation after having invalidated "
             "$importUri.\n\n"
             "This compile:\n"
             "${newUserLibraries.map((e) => e.toString()).join("\n")}\n\n"
-            "Original compile:\n"
-            "${result.userLibraries.map((e) => e.toString()).join("\n")}");
+            "${originalCompileString}");
       }
     }
 
-    if (originalFlag != null) {
-      context.explicitExperimentalFlags[
-          ExperimentalFlag.alternativeInvalidationStrategy] = originalFlag;
-    } else {
-      context.explicitExperimentalFlags
-          .remove(ExperimentalFlag.alternativeInvalidationStrategy);
-    }
-
     return null;
   }
 
@@ -1302,8 +1397,7 @@
       Component platform,
       UriTranslator uriTranslator,
       ComponentResult result,
-      FastaContext context,
-      bool? originalFlag) async {
+      FastaContext context) async {
     compilationSetup.errors.clear();
 
     FileSystem orgFileSystem = compilationSetup.options.fileSystem;
@@ -1430,14 +1524,152 @@
     compilationSetup.compilerOptions.fileSystem = orgFileSystem;
     return null;
   }
+
+  /// Splits all files into "sub files" that all import and export each other
+  /// so everything should still work (except for privacy).
+  /// Then invalidate one file at a time with forced experimental invalidation.
+  ///
+  /// Prerequisite: No errors should be present, as that doesn't work with
+  /// experimental invalidation.
+  Future<Result<ComponentResult>?> performFileSplitting(
+      CompilationSetup compilationSetup,
+      Component platform,
+      UriTranslator uriTranslator,
+      ComponentResult result,
+      FastaContext context) async {
+    FileSystem orgFileSystem = compilationSetup.options.fileSystem;
+    compilationSetup.options.clearFileSystemCache();
+    _FakeFileSystem fs = new _FakeFileSystem(orgFileSystem);
+    compilationSetup.compilerOptions.fileSystem = fs;
+    IncrementalCompiler incrementalCompiler =
+        new IncrementalCompiler.fromComponent(
+            new CompilerContext(compilationSetup.options), platform);
+    IncrementalCompilerResult initialResult =
+        await incrementalCompiler.computeDelta();
+    Component initialComponent = initialResult.component;
+    if (!canSerialize(initialComponent)) {
+      return new Result<ComponentResult>(result, semiFuzzFailure,
+          "Couldn't serialize initial component for fuzzing");
+    }
+
+    // Create lookup-table from file uri to whatever.
+    Map<Uri, LibraryBuilder> builders = {};
+    for (LibraryBuilder builder
+        in incrementalCompiler.kernelTargetForTesting!.loader.libraryBuilders) {
+      if (builder.importUri.isScheme("dart") && !builder.isSynthetic) continue;
+      if (builder.importUri.isScheme("package") &&
+          !builder.fileUri.toString().contains("/pkg/front_end/testcases/")) {
+        // A package uri where the file uri is *not* inside out testcases.
+        // This for instance ignores "package:expect/expect.dart" etc.
+        continue;
+      }
+      builders[builder.fileUri] = builder;
+      for (LibraryPart part in builder.library.parts) {
+        Uri thisPartUri = builder.importUri.resolve(part.partUri);
+        if (thisPartUri.isScheme("package")) {
+          thisPartUri = incrementalCompiler
+              .kernelTargetForTesting!.uriTranslator
+              .translate(thisPartUri)!;
+        }
+        builders[thisPartUri] = builder;
+      }
+    }
+
+    List<Uri> originalUris = List<Uri>.of(fs.data.keys);
+    for (Uri uri in originalUris) {
+      print("Work on $uri");
+      LibraryBuilder? builder = builders[uri];
+      if (builder == null) {
+        print("Skipping $uri -- couldn't find builder for it.");
+        continue;
+      }
+      Uint8List orgData = fs.data[uri] as Uint8List;
+      FuzzAstVisitorSorter fuzzAstVisitorSorter;
+      try {
+        fuzzAstVisitorSorter =
+            new FuzzAstVisitorSorter(orgData, builder.isNonNullableByDefault);
+      } on FormatException catch (e, st) {
+        // UTF-16-LE formatted test crashes `utf8.decode(bytes)` --- catch that
+        return new Result<ComponentResult>(
+            result,
+            semiFuzzCrash,
+            "$e\n\n"
+            "$st");
+      }
+
+      // Put each chunk into its own file.
+      StringBuffer headerSb = new StringBuffer();
+      List<FuzzAstVisitorSorterChunk> nonHeaderChunks = [];
+
+      for (FuzzAstVisitorSorterChunk chunk in fuzzAstVisitorSorter.chunks) {
+        if (chunk.originalType == FuzzOriginalType.Import ||
+            chunk.originalType == FuzzOriginalType.Export ||
+            chunk.originalType == FuzzOriginalType.LibraryName ||
+            chunk.originalType == FuzzOriginalType.Part ||
+            chunk.originalType == FuzzOriginalType.PartOf ||
+            chunk.originalType == FuzzOriginalType.LanguageVersion) {
+          headerSb.writeln(chunk.getSource());
+        } else {
+          nonHeaderChunks.add(chunk);
+        }
+      }
+
+      Uri getUriForChunk(int chunkNum) {
+        return uri.resolve(uri.pathSegments.last + ".split.$chunkNum.dart");
+      }
+
+      int totalSubFiles = nonHeaderChunks.length;
+      int currentSubFile = 0;
+      for (FuzzAstVisitorSorterChunk chunk in nonHeaderChunks) {
+        // We need to have special handling for dart versions, imports,
+        // exports, etc.
+        StringBuffer sb = new StringBuffer();
+        sb.writeln(headerSb.toString());
+        for (int i = 0; i < totalSubFiles; i++) {
+          if (i == currentSubFile) continue;
+          sb.writeln("import '${getUriForChunk(i)}';");
+          sb.writeln("export '${getUriForChunk(i)}';");
+        }
+        sb.writeln(chunk.getSource());
+        fs.data[getUriForChunk(currentSubFile)] =
+            utf8.encode(sb.toString()) as Uint8List;
+        currentSubFile++;
+      }
+
+      // Rewrite main file.
+      StringBuffer sb = new StringBuffer();
+      sb.writeln(headerSb.toString());
+      for (int i = 0; i < totalSubFiles; i++) {
+        sb.writeln("import '${getUriForChunk(i)}';");
+        sb.writeln("export '${getUriForChunk(i)}';");
+      }
+      fs.data[uri] = utf8.encode(sb.toString()) as Uint8List;
+    }
+
+    Result<ComponentResult>? passResult = await performFileInvalidation(
+      compilationSetup,
+      platform,
+      uriTranslator,
+      context,
+      originalCompilationResult: null,
+      forceAndCheckRebuildBodiesOnly: true,
+    );
+    if (passResult != null) return passResult;
+
+    compilationSetup.options.clearFileSystemCache();
+    compilationSetup.compilerOptions.fileSystem = orgFileSystem;
+    return null;
+  }
 }
 
 class FuzzAstVisitorSorterChunk {
+  final FuzzOriginalType originalType;
   final String data;
   final String? metadataAndComments;
   final int layer;
 
-  FuzzAstVisitorSorterChunk(this.data, this.metadataAndComments, this.layer);
+  FuzzAstVisitorSorterChunk(
+      this.originalType, this.data, this.metadataAndComments, this.layer);
 
   @override
   String toString() {
@@ -1454,6 +1686,23 @@
 
 enum FuzzSorterState { nonSortable, importExportSortable, sortableRest }
 
+enum FuzzOriginalType {
+  Import,
+  Export,
+  LanguageVersion,
+  AdditionalMetadata,
+  Class,
+  Mixin,
+  Enum,
+  Extension,
+  LibraryName,
+  Part,
+  PartOf,
+  TopLevelFields,
+  TopLevelMethod,
+  TypeDef,
+}
+
 class FuzzAstVisitorSorter extends ParserAstVisitor {
   final Uint8List bytes;
   final String asString;
@@ -1471,6 +1720,7 @@
           metadataStart!.charOffset, metadataEndInclusive!.charEnd);
       layer++;
       chunks.add(new FuzzAstVisitorSorterChunk(
+        FuzzOriginalType.AdditionalMetadata,
         "",
         metadata,
         layer,
@@ -1519,6 +1769,7 @@
     if (hasLanguageVersion) {
       layer++;
       chunks.add(new FuzzAstVisitorSorterChunk(
+        FuzzOriginalType.LanguageVersion,
         asString.substring(
             fromToken.precedingComments!.charOffset, comment.charEnd),
         null,
@@ -1528,8 +1779,8 @@
     }
   }
 
-  void handleData(
-      FuzzSorterState thisState, Token startInclusive, Token endInclusive) {
+  void handleData(FuzzOriginalType originalType, FuzzSorterState thisState,
+      Token startInclusive, Token endInclusive) {
     // Non-sortable things always gets a new layer.
     if (state != thisState || thisState == FuzzSorterState.nonSortable) {
       state = thisState;
@@ -1560,6 +1811,7 @@
           metadataStart!.charOffset, metadataEndInclusive!.charEnd);
     }
     chunks.add(new FuzzAstVisitorSorterChunk(
+      originalType,
       asString.substring(startInclusive.charOffset, endInclusive.charEnd),
       metadata,
       layer,
@@ -1570,39 +1822,43 @@
 
   @override
   void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
-    handleData(
-        FuzzSorterState.importExportSortable, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Export, FuzzSorterState.importExportSortable,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
-    handleData(
-        FuzzSorterState.importExportSortable, startInclusive, endInclusive!);
+    handleData(FuzzOriginalType.Import, FuzzSorterState.importExportSortable,
+        startInclusive, endInclusive!);
   }
 
   @override
   void visitClass(
       ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Class, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Enum, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitExtension(
       ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Extension, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitLibraryName(
       LibraryNameEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.LibraryName, FuzzSorterState.nonSortable,
+        startInclusive, endInclusive);
   }
 
   @override
@@ -1620,44 +1876,65 @@
   void visitMixin(
       MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Mixin, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitNamedMixin(
       NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Mixin, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.Part, FuzzSorterState.nonSortable,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.PartOf, FuzzSorterState.nonSortable,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitTopLevelFields(
       TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.TopLevelFields, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitTopLevelMethod(
       TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.TopLevelMethod, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 
   @override
   void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
-    handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
+    handleData(FuzzOriginalType.TypeDef, FuzzSorterState.sortableRest,
+        startInclusive, endInclusive);
   }
 }
 
+class SemiForceExperimentalInvalidationIncrementalCompiler
+    extends IncrementalCompiler {
+  @override
+  final TestRecorderForTesting recorderForTesting =
+      new TestRecorderForTesting();
+
+  @override
+  bool skipExperimentalInvalidationChecksForTesting = true;
+
+  SemiForceExperimentalInvalidationIncrementalCompiler.fromComponent(
+      CompilerContext context, Component? componentToInitializeFrom)
+      : super.fromComponent(context, componentToInitializeFrom);
+}
+
 class _FakeFileSystem extends FileSystem {
   bool redirectAndRecord = true;
   final Map<Uri, Uint8List?> data = {};
diff --git a/pkg/front_end/test/macros/declaration/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macros/declaration/data/pkgs/macro/lib/macro.dart
index c7fc7d5..99bcb57 100644
--- a/pkg/front_end/test/macros/declaration/data/pkgs/macro/lib/macro.dart
+++ b/pkg/front_end/test/macros/declaration/data/pkgs/macro/lib/macro.dart
@@ -25,3 +25,10 @@
 class NonMacro {
   const NonMacro();
 }
+
+macro class Macro4 implements Macro {
+  final field;
+  final named;
+
+  const Macro4(this.field, {this.named});
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/macros/declaration/data/tests/all_precompiled.dart b/pkg/front_end/test/macros/declaration/data/tests/all_precompiled.dart
index 2da2a58..6e2aea0 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/all_precompiled.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/all_precompiled.dart
@@ -10,6 +10,6 @@
 
 import 'package:precompiled_macro/precompiled_macro.dart';
 
-/*member: main:appliedMacros=[PrecompiledMacro.new]*/
+/*member: main:appliedMacros=[PrecompiledMacro.new()]*/
 @PrecompiledMacro()
 void main() {}
diff --git a/pkg/front_end/test/macros/declaration/data/tests/applications.dart b/pkg/front_end/test/macros/declaration/data/tests/applications.dart
index 1f03c5a..228b1f1 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/applications.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/applications.dart
@@ -21,7 +21,7 @@
   package:macro/macro.dart/Macro3/named()],
  macrosAreApplied,
  macrosAreAvailable,
- neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)]
+ neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)|Macro4(new)]
 */
 
 import 'package:macro/macro.dart';
@@ -29,10 +29,10 @@
 
 /*class: Class:
  appliedMacros=[
-  Macro1.new,
-  Macro2.named,
-  Macro2.new,
-  Macro3.named],
+  Macro1.new(),
+  Macro2.named(),
+  Macro2.new(),
+  Macro3.named()],
  macrosAreApplied
 */
 @Macro2.named()
@@ -41,31 +41,31 @@
 @Macro1()
 class Class {
   /*member: Class.:appliedMacros=[
-    Macro1.named,
-    Macro1.new,
-    Macro2.named,
-    Macro3.new]*/
+    Macro1.named(),
+    Macro1.new(),
+    Macro2.named(),
+    Macro3.new()]*/
   @Macro1.named()
   @prefix.Macro1()
   @prefix.Macro2.named()
   @Macro3()
   Class();
 
-  /*member: Class.method:appliedMacros=[Macro3.named]*/
+  /*member: Class.method:appliedMacros=[Macro3.named()]*/
   @Macro3.named()
   void method() {}
 
-  /*member: Class.field:appliedMacros=[Macro3.new]*/
+  /*member: Class.field:appliedMacros=[Macro3.new()]*/
   @prefix.Macro3()
   var field;
 }
 
-/*member: method:appliedMacros=[Macro2.named]*/
+/*member: method:appliedMacros=[Macro2.named()]*/
 @Macro2.named()
 void method() {}
 
 @Macro3()
-/*member: field:appliedMacros=[Macro3.new]*/
+/*member: field:appliedMacros=[Macro3.new()]*/
 var field;
 
 main() {}
diff --git a/pkg/front_end/test/macros/declaration/data/tests/declare_vs_apply/apply_lib.dart b/pkg/front_end/test/macros/declaration/data/tests/declare_vs_apply/apply_lib.dart
index fc6ae56..1ae6cfa 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/declare_vs_apply/apply_lib.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/declare_vs_apply/apply_lib.dart
@@ -11,7 +11,7 @@
 import 'apply_lib_dep.dart';
 
 /*class: Class:
- appliedMacros=[Macro1.new],
+ appliedMacros=[Macro1.new()],
  macrosAreApplied
 */
 @Macro1()
diff --git a/pkg/front_end/test/macros/declaration/data/tests/import_macro_package.dart b/pkg/front_end/test/macros/declaration/data/tests/import_macro_package.dart
index 64d7efc..daf3f12 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/import_macro_package.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/import_macro_package.dart
@@ -7,7 +7,7 @@
   package:_fe_analyzer_shared/src/macros/api.dart|package:macro/macro.dart,
   main.dart],
  macrosAreAvailable,
- neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)]
+ neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)|Macro4(new)]
 */
 
 // ignore: unused_import
diff --git a/pkg/front_end/test/macros/declaration/data/tests/macro_arguments.dart b/pkg/front_end/test/macros/declaration/data/tests/macro_arguments.dart
new file mode 100644
index 0000000..3f14d68
--- /dev/null
+++ b/pkg/front_end/test/macros/declaration/data/tests/macro_arguments.dart
@@ -0,0 +1,79 @@
+// 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.
+
+/*library: 
+ compilationSequence=[
+  package:_fe_analyzer_shared/src/macros/api.dart|package:macro/macro.dart,
+  main.dart],
+ macroInstanceIds=[
+  package:macro/macro.dart/Macro4/(3.14),
+  package:macro/macro.dart/Macro4/(3.14,named:1.41),
+  package:macro/macro.dart/Macro4/(42),
+  package:macro/macro.dart/Macro4/(87,named:42),
+  package:macro/macro.dart/Macro4/(bar,named:baz),
+  package:macro/macro.dart/Macro4/(false),
+  package:macro/macro.dart/Macro4/(false,named:true),
+  package:macro/macro.dart/Macro4/(foo),
+  package:macro/macro.dart/Macro4/(foobar),
+  package:macro/macro.dart/Macro4/(foobar,named:boz_qux),
+  package:macro/macro.dart/Macro4/(null),
+  package:macro/macro.dart/Macro4/(null,named:null),
+  package:macro/macro.dart/Macro4/(qux,named:boz),
+  package:macro/macro.dart/Macro4/(true)],
+ macrosAreApplied,
+ macrosAreAvailable,
+ neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)|Macro4(new)]
+*/
+
+import 'package:macro/macro.dart';
+
+/*member: function1:appliedMacros=[
+  Macro4.new(null),
+  Macro4.new(null,named:null)]*/
+@Macro4(null)
+@Macro4(null, named: null)
+function1() {}
+
+/*member: function2:appliedMacros=[
+  Macro4.new(42),
+  Macro4.new(87,named:42)]*/
+@Macro4(42)
+@Macro4(87, named: 42)
+function2() {}
+
+/*member: function3:appliedMacros=[
+  Macro4.new(false,named:true),
+  Macro4.new(true)]*/
+@Macro4(true)
+@Macro4(false, named: true)
+function3() {}
+
+/*member: function4:appliedMacros=[Macro4.new(false)]*/
+@Macro4(false)
+function4() {}
+
+/*member: function5:appliedMacros=[
+  Macro4.new(bar,named:baz),
+  Macro4.new(foo),
+  Macro4.new(qux,named:boz)]*/
+@Macro4("foo")
+@Macro4("bar", named: "baz")
+@Macro4(named: "boz", "qux")
+function5() {}
+
+/*member: function6:appliedMacros=[
+  Macro4.new(3.14),
+  Macro4.new(3.14,named:1.41)]*/
+@Macro4(3.14)
+@Macro4(3.14, named: 1.41)
+function6() {}
+
+/*member: function7:appliedMacros=[
+  Macro4.new(foobar),
+  Macro4.new(foobar,named:boz_qux)]*/
+@Macro4("foo" "bar")
+@Macro4("foo" "bar", named: "boz" "_" "qux")
+function7() {}
+
+main() {}
diff --git a/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/macro_lib2b.dart b/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/macro_lib2b.dart
index 3aa757c..e220fb9d 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/macro_lib2b.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/macro_lib2b.dart
@@ -12,7 +12,7 @@
 import 'macro_lib2a.dart';
 
 /*class: Macro2b:
- appliedMacros=[Macro2a.new],
+ appliedMacros=[Macro2a.new()],
  macrosAreApplied
 */
 @Macro2a()
diff --git a/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/main.dart b/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/main.dart
index 1e9ac81..73727a0 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/main.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/multiple_macros/main.dart
@@ -22,9 +22,9 @@
 import 'macro_lib2b.dart';
 
 /*member: main:appliedMacros=[
-  Macro1.new,
-  Macro2a.new,
-  Macro2b.new]*/
+  Macro1.new(),
+  Macro2a.new(),
+  Macro2b.new()]*/
 @Macro1()
 @Macro2a()
 @Macro2b()
diff --git a/pkg/front_end/test/macros/declaration/data/tests/precompiled.dart b/pkg/front_end/test/macros/declaration/data/tests/precompiled.dart
index 1311d4c..075dd0a 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/precompiled.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/precompiled.dart
@@ -11,15 +11,15 @@
   package:precompiled_macro/precompiled_macro.dart/PrecompiledMacro/()],
  macrosAreApplied,
  macrosAreAvailable,
- neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)]
+ neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)|Macro4(new)]
 */
 
 import 'package:precompiled_macro/precompiled_macro.dart';
 import 'package:macro/macro.dart';
 
 /*member: main:appliedMacros=[
-  Macro1.new,
-  PrecompiledMacro.new]*/
+  Macro1.new(),
+  PrecompiledMacro.new()]*/
 @PrecompiledMacro()
 @Macro1()
 void main() {}
diff --git a/pkg/front_end/test/macros/declaration/data/tests/use_macro_package.dart b/pkg/front_end/test/macros/declaration/data/tests/use_macro_package.dart
index 1db43d7..608039c 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/use_macro_package.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/use_macro_package.dart
@@ -16,29 +16,29 @@
   package:macro/macro.dart/Macro3/()],
  macrosAreApplied,
  macrosAreAvailable,
- neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)]
+ neededPrecompilations=[package:macro/macro.dart=Macro1(named/new)|Macro2(named/new)|Macro3(named/new)|Macro4(new)]
 */
 library use_macro_package;
 
 import 'package:macro/macro.dart';
 
-/*member: main:appliedMacros=[Macro1.new]*/
+/*member: main:appliedMacros=[Macro1.new()]*/
 @Macro1()
 void main() {}
 
 /*class: Class1:
- appliedMacros=[Macro2.new],
+ appliedMacros=[Macro2.new()],
  macrosAreApplied
 */
 @Macro2()
 class Class1 {
-  /*member: Class1.:appliedMacros=[Macro3.new]*/
+  /*member: Class1.:appliedMacros=[Macro3.new()]*/
   @Macro3()
   Class1();
 
   /*member: Class1.method:appliedMacros=[
-    Macro1.new,
-    Macro2.new]*/
+    Macro1.new(),
+    Macro2.new()]*/
   @Macro1()
   @Macro2()
   void method() {}
@@ -49,7 +49,7 @@
 
 /*class: Class3:macrosAreApplied*/
 class Class3 {
-  /*member: Class3.field:appliedMacros=[Macro3.new]*/
+  /*member: Class3.field:appliedMacros=[Macro3.new()]*/
   @Macro3()
   var field;
 }
@@ -59,7 +59,7 @@
   var field;
 }
 
-/*member: field:appliedMacros=[Macro1.new]*/
+/*member: field:appliedMacros=[Macro1.new()]*/
 @Macro1()
 var field;
 
diff --git a/pkg/front_end/test/macros/declaration/data/tests/use_macro_source/main.dart b/pkg/front_end/test/macros/declaration/data/tests/use_macro_source/main.dart
index fb50380..819b982 100644
--- a/pkg/front_end/test/macros/declaration/data/tests/use_macro_source/main.dart
+++ b/pkg/front_end/test/macros/declaration/data/tests/use_macro_source/main.dart
@@ -19,19 +19,19 @@
 
 import 'macro_lib.dart';
 
-/*member: main:appliedMacros=[Macro1.new]*/
+/*member: main:appliedMacros=[Macro1.new()]*/
 @Macro1()
 void main() {}
 
 /*class: Class1:
- appliedMacros=[Macro2.new],
+ appliedMacros=[Macro2.new()],
  macrosAreApplied
 */
 @Macro2()
 class Class1 {
   /*member: Class1.method:appliedMacros=[
-    Macro1.new,
-    Macro2.new]*/
+    Macro1.new(),
+    Macro2.new()]*/
   @Macro1()
   @Macro2()
   void method() {}
@@ -42,7 +42,7 @@
 
 /*class: Class3:macrosAreApplied*/
 class Class3 {
-  /*member: Class3.field:appliedMacros=[Macro1.new]*/
+  /*member: Class3.field:appliedMacros=[Macro1.new()]*/
   @Macro1()
   var field;
 }
diff --git a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
index 746e1a6..de7512f 100644
--- a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
+++ b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
@@ -198,11 +198,12 @@
       Features features, List<MacroApplication>? macroApplications) {
     if (macroApplications != null) {
       for (MacroApplication application in macroApplications) {
-        String className = application.classBuilder.name;
-        String constructorName =
-            constructorNameToString(application.constructorName);
-        features.addElement(
-            Tags.appliedMacros, '${className}.${constructorName}');
+        StringBuffer sb = new StringBuffer();
+        sb.write(application.classBuilder.name);
+        sb.write('.');
+        sb.write(constructorNameToString(application.constructorName));
+        sb.write(application.arguments.toText());
+        features.addElement(Tags.appliedMacros, sb.toString());
       }
     }
   }
@@ -347,7 +348,8 @@
   _MacroInstanceIdentifier(
       this.library, this.name, this.constructor, this.arguments);
 
-  String toText() => '${importUriToString(library)}/${name}/${constructor}()';
+  String toText() => '${importUriToString(library)}/${name}/'
+      '${constructor}${arguments.toText()}';
 
   @override
   void serialize(Serializer serializer) => throw UnimplementedError();
@@ -374,3 +376,25 @@
     throw UnimplementedError();
   }
 }
+
+extension on Arguments {
+  String toText() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('(');
+    String comma = '';
+    for (Object? positional in positional) {
+      sb.write(comma);
+      sb.write(positional);
+      comma = ',';
+    }
+    for (MapEntry<String, Object?> named in named.entries) {
+      sb.write(comma);
+      sb.write(named.key);
+      sb.write(':');
+      sb.write(named.value);
+      comma = ',';
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 5f1144f..38d1b02 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -490,6 +490,7 @@
 pp
 preliminary
 prematurely
+prerequisite
 press
 pretends
 printouts
@@ -514,6 +515,7 @@
 quux
 quuz
 reality
+recompilation
 recompiles
 redir
 redirections
@@ -620,6 +622,7 @@
 supermixin
 supplement
 suspension
+swallow
 t\b\f\u
 t\u
 ta
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart b/pkg/front_end/testcases/extensions/ambiguous.dart
index 58c25ea..df66ba8 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension A on C {
   void method() {}
   int get getter => 42;
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline.expect
index 64d21ffcd..cdead34 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension A on C {
   void method() {}
   int get getter => 42;
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline_modelled.expect
index 56bcb51..181cba7e 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {}
 
 errors(C c) {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.expect
index 1dca435..3e35b2e 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -150,21 +150,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A on self::C* {
+extension A on self::C {
   method method = self::A|method;
   tearoff method = self::A|get#method;
   get getter = self::A|get#getter;
@@ -174,7 +164,7 @@
   operator [] = self::A|[];
   set setter = self::A|set#setter;
 }
-extension B on self::C* {
+extension B on self::C {
   method method = self::B|method;
   tearoff method = self::B|get#method;
   get getter = self::B|get#getter;
@@ -184,33 +174,33 @@
   set setter = self::B|set#setter;
   set property = self::B|set#property;
 }
-static method A|method(lowered final self::C* #this) → void {}
-static method A|get#method(lowered final self::C* #this) → () →* void
+static method A|method(lowered final self::C #this) → void {}
+static method A|get#method(lowered final self::C #this) → () → void
   return () → void => self::A|method(#this);
-static method A|get#getter(lowered final self::C* #this) → core::int*
+static method A|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method A|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method A|get#property(lowered final self::C* #this) → core::int*
+static method A|set#setter(lowered final self::C #this, core::int value) → void {}
+static method A|get#property(lowered final self::C #this) → core::int
   return 42;
-static method A|+(lowered final self::C* #this, core::int* i) → core::int*
+static method A|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method A|unary-(lowered final self::C* #this) → core::int*
+static method A|unary-(lowered final self::C #this) → core::int
   return 0;
-static method A|[](lowered final self::C* #this, core::int* i) → core::int*
+static method A|[](lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|method(lowered final self::C* #this) → void {}
-static method B|get#method(lowered final self::C* #this) → () →* void
+static method B|method(lowered final self::C #this) → void {}
+static method B|get#method(lowered final self::C #this) → () → void
   return () → void => self::B|method(#this);
-static method B|get#getter(lowered final self::C* #this) → core::int*
+static method B|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method B|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method B|set#property(lowered final self::C* #this, core::int* value) → void {}
-static method B|+(lowered final self::C* #this, core::int* i) → core::int*
+static method B|set#setter(lowered final self::C #this, core::int value) → void {}
+static method B|set#property(lowered final self::C #this, core::int value) → void {}
+static method B|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|unary-(lowered final self::C* #this) → core::int*
+static method B|unary-(lowered final self::C #this) → core::int
   return 0;
-static method B|[]=(lowered final self::C* #this, core::int* i, core::int* j) → void {}
-static method errors(self::C* c) → dynamic {
+static method B|[]=(lowered final self::C #this, core::int i, core::int j) → void {}
+static method errors(self::C c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
 Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect
index 1dca435..3e35b2e 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -150,21 +150,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A on self::C* {
+extension A on self::C {
   method method = self::A|method;
   tearoff method = self::A|get#method;
   get getter = self::A|get#getter;
@@ -174,7 +164,7 @@
   operator [] = self::A|[];
   set setter = self::A|set#setter;
 }
-extension B on self::C* {
+extension B on self::C {
   method method = self::B|method;
   tearoff method = self::B|get#method;
   get getter = self::B|get#getter;
@@ -184,33 +174,33 @@
   set setter = self::B|set#setter;
   set property = self::B|set#property;
 }
-static method A|method(lowered final self::C* #this) → void {}
-static method A|get#method(lowered final self::C* #this) → () →* void
+static method A|method(lowered final self::C #this) → void {}
+static method A|get#method(lowered final self::C #this) → () → void
   return () → void => self::A|method(#this);
-static method A|get#getter(lowered final self::C* #this) → core::int*
+static method A|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method A|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method A|get#property(lowered final self::C* #this) → core::int*
+static method A|set#setter(lowered final self::C #this, core::int value) → void {}
+static method A|get#property(lowered final self::C #this) → core::int
   return 42;
-static method A|+(lowered final self::C* #this, core::int* i) → core::int*
+static method A|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method A|unary-(lowered final self::C* #this) → core::int*
+static method A|unary-(lowered final self::C #this) → core::int
   return 0;
-static method A|[](lowered final self::C* #this, core::int* i) → core::int*
+static method A|[](lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|method(lowered final self::C* #this) → void {}
-static method B|get#method(lowered final self::C* #this) → () →* void
+static method B|method(lowered final self::C #this) → void {}
+static method B|get#method(lowered final self::C #this) → () → void
   return () → void => self::B|method(#this);
-static method B|get#getter(lowered final self::C* #this) → core::int*
+static method B|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method B|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method B|set#property(lowered final self::C* #this, core::int* value) → void {}
-static method B|+(lowered final self::C* #this, core::int* i) → core::int*
+static method B|set#setter(lowered final self::C #this, core::int value) → void {}
+static method B|set#property(lowered final self::C #this, core::int value) → void {}
+static method B|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|unary-(lowered final self::C* #this) → core::int*
+static method B|unary-(lowered final self::C #this) → core::int
   return 0;
-static method B|[]=(lowered final self::C* #this, core::int* i, core::int* j) → void {}
-static method errors(self::C* c) → dynamic {
+static method B|[]=(lowered final self::C #this, core::int i, core::int j) → void {}
+static method errors(self::C c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
 Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.outline.expect
index 8ac03b2..a4095ab 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.outline.expect
@@ -1,22 +1,12 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A on self::C* {
+extension A on self::C {
   method method = self::A|method;
   tearoff method = self::A|get#method;
   get getter = self::A|get#getter;
@@ -26,7 +16,7 @@
   operator [] = self::A|[];
   set setter = self::A|set#setter;
 }
-extension B on self::C* {
+extension B on self::C {
   method method = self::B|method;
   tearoff method = self::B|get#method;
   get getter = self::B|get#getter;
@@ -36,39 +26,39 @@
   set setter = self::B|set#setter;
   set property = self::B|set#property;
 }
-static method A|method(lowered final self::C* #this) → void
+static method A|method(lowered final self::C #this) → void
   ;
-static method A|get#method(lowered final self::C* #this) → () →* void
+static method A|get#method(lowered final self::C #this) → () → void
   return () → void => self::A|method(#this);
-static method A|get#getter(lowered final self::C* #this) → core::int*
+static method A|get#getter(lowered final self::C #this) → core::int
   ;
-static method A|set#setter(lowered final self::C* #this, core::int* value) → void
+static method A|set#setter(lowered final self::C #this, core::int value) → void
   ;
-static method A|get#property(lowered final self::C* #this) → core::int*
+static method A|get#property(lowered final self::C #this) → core::int
   ;
-static method A|+(lowered final self::C* #this, core::int* i) → core::int*
+static method A|+(lowered final self::C #this, core::int i) → core::int
   ;
-static method A|unary-(lowered final self::C* #this) → core::int*
+static method A|unary-(lowered final self::C #this) → core::int
   ;
-static method A|[](lowered final self::C* #this, core::int* i) → core::int*
+static method A|[](lowered final self::C #this, core::int i) → core::int
   ;
-static method B|method(lowered final self::C* #this) → void
+static method B|method(lowered final self::C #this) → void
   ;
-static method B|get#method(lowered final self::C* #this) → () →* void
+static method B|get#method(lowered final self::C #this) → () → void
   return () → void => self::B|method(#this);
-static method B|get#getter(lowered final self::C* #this) → core::int*
+static method B|get#getter(lowered final self::C #this) → core::int
   ;
-static method B|set#setter(lowered final self::C* #this, core::int* value) → void
+static method B|set#setter(lowered final self::C #this, core::int value) → void
   ;
-static method B|set#property(lowered final self::C* #this, core::int* value) → void
+static method B|set#property(lowered final self::C #this, core::int value) → void
   ;
-static method B|+(lowered final self::C* #this, core::int* i) → core::int*
+static method B|+(lowered final self::C #this, core::int i) → core::int
   ;
-static method B|unary-(lowered final self::C* #this) → core::int*
+static method B|unary-(lowered final self::C #this) → core::int
   ;
-static method B|[]=(lowered final self::C* #this, core::int* i, core::int* j) → void
+static method B|[]=(lowered final self::C #this, core::int i, core::int j) → void
   ;
-static method errors(self::C* c) → dynamic
+static method errors(self::C c) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.transformed.expect
index 1dca435..3e35b2e 100644
--- a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -150,21 +150,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A on self::C* {
+extension A on self::C {
   method method = self::A|method;
   tearoff method = self::A|get#method;
   get getter = self::A|get#getter;
@@ -174,7 +164,7 @@
   operator [] = self::A|[];
   set setter = self::A|set#setter;
 }
-extension B on self::C* {
+extension B on self::C {
   method method = self::B|method;
   tearoff method = self::B|get#method;
   get getter = self::B|get#getter;
@@ -184,33 +174,33 @@
   set setter = self::B|set#setter;
   set property = self::B|set#property;
 }
-static method A|method(lowered final self::C* #this) → void {}
-static method A|get#method(lowered final self::C* #this) → () →* void
+static method A|method(lowered final self::C #this) → void {}
+static method A|get#method(lowered final self::C #this) → () → void
   return () → void => self::A|method(#this);
-static method A|get#getter(lowered final self::C* #this) → core::int*
+static method A|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method A|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method A|get#property(lowered final self::C* #this) → core::int*
+static method A|set#setter(lowered final self::C #this, core::int value) → void {}
+static method A|get#property(lowered final self::C #this) → core::int
   return 42;
-static method A|+(lowered final self::C* #this, core::int* i) → core::int*
+static method A|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method A|unary-(lowered final self::C* #this) → core::int*
+static method A|unary-(lowered final self::C #this) → core::int
   return 0;
-static method A|[](lowered final self::C* #this, core::int* i) → core::int*
+static method A|[](lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|method(lowered final self::C* #this) → void {}
-static method B|get#method(lowered final self::C* #this) → () →* void
+static method B|method(lowered final self::C #this) → void {}
+static method B|get#method(lowered final self::C #this) → () → void
   return () → void => self::B|method(#this);
-static method B|get#getter(lowered final self::C* #this) → core::int*
+static method B|get#getter(lowered final self::C #this) → core::int
   return 42;
-static method B|set#setter(lowered final self::C* #this, core::int* value) → void {}
-static method B|set#property(lowered final self::C* #this, core::int* value) → void {}
-static method B|+(lowered final self::C* #this, core::int* i) → core::int*
+static method B|set#setter(lowered final self::C #this, core::int value) → void {}
+static method B|set#property(lowered final self::C #this, core::int value) → void {}
+static method B|+(lowered final self::C #this, core::int i) → core::int
   return i;
-static method B|unary-(lowered final self::C* #this) → core::int*
+static method B|unary-(lowered final self::C #this) → core::int
   return 0;
-static method B|[]=(lowered final self::C* #this, core::int* i, core::int* j) → void {}
-static method errors(self::C* c) → dynamic {
+static method B|[]=(lowered final self::C #this, core::int i, core::int j) → void {}
+static method errors(self::C c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
 Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
diff --git a/pkg/front_end/testcases/extensions/annotations.dart b/pkg/front_end/testcases/extensions/annotations.dart
index 5144d09..0e0b623 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart
+++ b/pkg/front_end/testcases/extensions/annotations.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 class Class {
   @pragma('dart2js:noInline')
   instanceMethod() {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.textual_outline.expect
index a48748b..29e0b7f 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   @pragma('dart2js:noInline')
   instanceMethod() {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/annotations.dart.textual_outline_modelled.expect
index 3c38648..ad11530 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   @pragma('dart2js:noInline')
   instanceMethod() {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.expect
index 61a26a4..665bd67 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.expect
@@ -1,34 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
   @#C3
   method instanceMethod() → dynamic {}
   @#C3
   static method staticMethod() → dynamic {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
   tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
   static method extensionStaticMethod = self::Extension|extensionStaticMethod;
 }
 @#C3
-static method Extension|extensionInstanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#extensionInstanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|extensionInstanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#extensionInstanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|extensionInstanceMethod(#this);
 @#C3
 static method Extension|extensionStaticMethod() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect
index 61a26a4..665bd67 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect
@@ -1,34 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
   @#C3
   method instanceMethod() → dynamic {}
   @#C3
   static method staticMethod() → dynamic {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
   tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
   static method extensionStaticMethod = self::Extension|extensionStaticMethod;
 }
 @#C3
-static method Extension|extensionInstanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#extensionInstanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|extensionInstanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#extensionInstanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|extensionInstanceMethod(#this);
 @#C3
 static method Extension|extensionStaticMethod() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
index 1ab642c..5f35a3a 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
@@ -1,9 +1,9 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
   @core::pragma::_("dart2js:noInline")
   method instanceMethod() → dynamic
@@ -11,26 +11,16 @@
   @core::pragma::_("dart2js:noInline")
   static method staticMethod() → dynamic
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
   tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
   static method extensionStaticMethod = self::Extension|extensionStaticMethod;
 }
 @core::pragma::_("dart2js:noInline")
-static method Extension|extensionInstanceMethod(lowered final self::Class* #this) → dynamic
+static method Extension|extensionInstanceMethod(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#extensionInstanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#extensionInstanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|extensionInstanceMethod(#this);
 @core::pragma::_("dart2js:noInline")
 static method Extension|extensionStaticMethod() → dynamic
@@ -43,9 +33,9 @@
 
 
 Extra constant evaluation status:
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:8:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:11:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:16:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:19:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:23:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:6:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
 Extra constant evaluation: evaluated: 8, effectively constant: 5
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.transformed.expect
index 61a26a4..665bd67 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.transformed.expect
@@ -1,34 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
   @#C3
   method instanceMethod() → dynamic {}
   @#C3
   static method staticMethod() → dynamic {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
   tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
   static method extensionStaticMethod = self::Extension|extensionStaticMethod;
 }
 @#C3
-static method Extension|extensionInstanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#extensionInstanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|extensionInstanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#extensionInstanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|extensionInstanceMethod(#this);
 @#C3
 static method Extension|extensionStaticMethod() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart b/pkg/front_end/testcases/extensions/async_extensions.dart
index 5c884cb..a958690 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on int {
   syncStarMethod() sync* {}
   asyncMethod() async {}
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline.expect
index 34b69e8..101e634 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension on int {
   syncStarMethod() sync* {}
   asyncMethod() async {}
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline_modelled.expect
index a4561c1..52c36dd 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension on int {
   asyncMethod() async {}
   asyncStarMethod() async* {}
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.expect
index 1cd81f5..bf6bac9 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   method syncStarMethod = self::Extension|syncStarMethod;
   tearoff syncStarMethod = self::Extension|get#syncStarMethod;
   method asyncMethod = self::Extension|asyncMethod;
@@ -10,14 +10,14 @@
   method asyncStarMethod = self::Extension|asyncStarMethod;
   tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
 }
-static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic sync* {}
-static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|syncStarMethod(lowered final core::int #this) → dynamic sync* {}
+static method Extension|get#syncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|syncStarMethod(#this);
-static method Extension|asyncMethod(lowered final core::int* #this) → dynamic async /* futureValueType= dynamic */ {}
-static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|asyncMethod(lowered final core::int #this) → dynamic async /* futureValueType= dynamic */ {}
+static method Extension|get#asyncMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncMethod(#this);
-static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic async* {}
-static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|asyncStarMethod(lowered final core::int #this) → dynamic async* {}
+static method Extension|get#asyncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncStarMethod(#this);
 static method main() → dynamic {
   self::Extension|syncStarMethod(0);
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect
index 1cd81f5..bf6bac9 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   method syncStarMethod = self::Extension|syncStarMethod;
   tearoff syncStarMethod = self::Extension|get#syncStarMethod;
   method asyncMethod = self::Extension|asyncMethod;
@@ -10,14 +10,14 @@
   method asyncStarMethod = self::Extension|asyncStarMethod;
   tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
 }
-static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic sync* {}
-static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|syncStarMethod(lowered final core::int #this) → dynamic sync* {}
+static method Extension|get#syncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|syncStarMethod(#this);
-static method Extension|asyncMethod(lowered final core::int* #this) → dynamic async /* futureValueType= dynamic */ {}
-static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|asyncMethod(lowered final core::int #this) → dynamic async /* futureValueType= dynamic */ {}
+static method Extension|get#asyncMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncMethod(#this);
-static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic async* {}
-static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|asyncStarMethod(lowered final core::int #this) → dynamic async* {}
+static method Extension|get#asyncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncStarMethod(#this);
 static method main() → dynamic {
   self::Extension|syncStarMethod(0);
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.outline.expect
index cc28afd..5a806b1 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.outline.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   method syncStarMethod = self::Extension|syncStarMethod;
   tearoff syncStarMethod = self::Extension|get#syncStarMethod;
   method asyncMethod = self::Extension|asyncMethod;
@@ -10,17 +10,17 @@
   method asyncStarMethod = self::Extension|asyncStarMethod;
   tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
 }
-static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic sync* 
+static method Extension|syncStarMethod(lowered final core::int #this) → dynamic sync* 
   ;
-static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#syncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|syncStarMethod(#this);
-static method Extension|asyncMethod(lowered final core::int* #this) → dynamic async 
+static method Extension|asyncMethod(lowered final core::int #this) → dynamic async 
   ;
-static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#asyncMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncMethod(#this);
-static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic async* 
+static method Extension|asyncStarMethod(lowered final core::int #this) → dynamic async* 
   ;
-static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#asyncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncStarMethod(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.transformed.expect
index c9d8f91..66e1488 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.transformed.expect
@@ -1,9 +1,9 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   method syncStarMethod = self::Extension|syncStarMethod;
   tearoff syncStarMethod = self::Extension|get#syncStarMethod;
   method asyncMethod = self::Extension|asyncMethod;
@@ -11,11 +11,11 @@
   method asyncStarMethod = self::Extension|asyncStarMethod;
   tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
 }
-static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
-    core::int* :await_jump_var = 0;
+static method Extension|syncStarMethod(lowered final core::int #this) → dynamic /* originally sync* */ {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
+    core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {}
       return false;
     }
@@ -23,15 +23,15 @@
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
-static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#syncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|syncStarMethod(#this);
-static method Extension|asyncMethod(lowered final core::int* #this) → dynamic /* futureValueType= dynamic */ /* originally async */ {
-  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+static method Extension|asyncMethod(lowered final core::int #this) → dynamic /* futureValueType= dynamic */ /* originally async */ {
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
   core::bool* :is_sync = false;
   dynamic :return_value;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
     try {
@@ -40,23 +40,23 @@
       asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
-    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
       asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_op(null, null){() →* dynamic};
+  :async_op(null, null){() → dynamic};
   :is_sync = true;
   return :async_future;
 }
-static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#asyncMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncMethod(#this);
-static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic /* originally async* */ {
-  asy::_AsyncStarStreamController<dynamic>* :controller;
+static method Extension|asyncStarMethod(lowered final core::int #this) → dynamic /* originally async* */ {
+  asy::_AsyncStarStreamController<dynamic>? :controller;
   dynamic :controller_stream;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
     try
@@ -65,7 +65,7 @@
         {}
         return;
       }
-      on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
         :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
       }
     finally {
@@ -77,7 +77,7 @@
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<dynamic>};
   return :controller_stream;
 }
-static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
+static method Extension|get#asyncStarMethod(lowered final core::int #this) → () → dynamic
   return () → dynamic => self::Extension|asyncStarMethod(#this);
 static method main() → dynamic {
   self::Extension|syncStarMethod(0);
diff --git a/pkg/front_end/testcases/extensions/bounds.dart b/pkg/front_end/testcases/extensions/bounds.dart
index 104117b..ee4308a 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart
+++ b/pkg/front_end/testcases/extensions/bounds.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension1<T extends Object> on T {
   method1<S extends Object>() {}
   method2<S extends String>() {}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/bounds.dart.textual_outline.expect
index e32a7f7..fe4b2b0 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension1<T extends Object> on T {
   method1<S extends Object>() {}
   method2<S extends String>() {}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/bounds.dart.textual_outline_modelled.expect
index e32a7f7..fe4b2b0 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension1<T extends Object> on T {
   method1<S extends Object>() {}
   method2<S extends String>() {}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
index 8c13b5c..bcf36b9 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object*> on T* {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String*> on T* {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic> on T* {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -32,7 +32,7 @@
   method method4 = self::Extension3|method4;
   tearoff method4 = self::Extension3|get#method4;
 }
-extension Extension4<T extends core::Object* = dynamic> on T* {
+extension Extension4<T extends core::Object? = dynamic> on T% {
   method method1 = self::Extension4|method1;
   tearoff method1 = self::Extension4|get#method1;
   method method2 = self::Extension4|method2;
@@ -42,52 +42,52 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
-static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
   return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
-static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
-static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
+static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect
index 8c13b5c..bcf36b9 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object*> on T* {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String*> on T* {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic> on T* {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -32,7 +32,7 @@
   method method4 = self::Extension3|method4;
   tearoff method4 = self::Extension3|get#method4;
 }
-extension Extension4<T extends core::Object* = dynamic> on T* {
+extension Extension4<T extends core::Object? = dynamic> on T% {
   method method1 = self::Extension4|method1;
   tearoff method1 = self::Extension4|get#method1;
   method method2 = self::Extension4|method2;
@@ -42,52 +42,52 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
-static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
   return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
-static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
-static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
+static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
index 923a293..f0bd53d 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object*> on T* {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String*> on T* {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic> on T* {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -32,7 +32,7 @@
   method method4 = self::Extension3|method4;
   tearoff method4 = self::Extension3|get#method4;
 }
-extension Extension4<T extends core::Object* = dynamic> on T* {
+extension Extension4<T extends core::Object? = dynamic> on T% {
   method method1 = self::Extension4|method1;
   tearoff method1 = self::Extension4|get#method1;
   method method2 = self::Extension4|method2;
@@ -42,69 +42,69 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic
   ;
-static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic
   ;
-static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic
   ;
-static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic
   ;
-static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic
   ;
-static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic
   ;
-static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic
   ;
-static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic
   ;
-static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic
   ;
-static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic
   ;
-static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic
   ;
-static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
   return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic
   ;
-static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic
   ;
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic
   ;
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic
   ;
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
-static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic
   ;
-static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
+static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
index 8c13b5c..bcf36b9 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object*> on T* {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String*> on T* {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic> on T* {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -32,7 +32,7 @@
   method method4 = self::Extension3|method4;
   tearoff method4 = self::Extension3|get#method4;
 }
-extension Extension4<T extends core::Object* = dynamic> on T* {
+extension Extension4<T extends core::Object? = dynamic> on T% {
   method method1 = self::Extension4|method1;
   tearoff method1 = self::Extension4|get#method1;
   method method2 = self::Extension4|method2;
@@ -42,52 +42,52 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
-static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
   return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
-  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
-  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
-  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
-static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
-static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
-  return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
+static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart b/pkg/front_end/testcases/extensions/builtin_identifiers.dart
index 452cea3..ada520d 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension mixin on int {}
 
 extension extension on int {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline.expect
index 2e6f837..3fef925 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension mixin on int {}
 
 extension extension on int {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline_modelled.expect
index b1fc88b..94a2d44 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension as on int {}
 
 extension extension on int {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.expect
index dba880e..0b269da 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension mixin on core::int* {
+extension mixin on core::int {
 }
-extension extension on core::int* {
+extension extension on core::int {
 }
-extension as on core::int* {
+extension as on core::int {
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect
index dba880e..0b269da 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension mixin on core::int* {
+extension mixin on core::int {
 }
-extension extension on core::int* {
+extension extension on core::int {
 }
-extension as on core::int* {
+extension as on core::int {
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.outline.expect
index deff425..97d86db 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,11 +17,11 @@
 import self as self;
 import "dart:core" as core;
 
-extension mixin on core::int* {
+extension mixin on core::int {
 }
-extension extension on core::int* {
+extension extension on core::int {
 }
-extension as on core::int* {
+extension as on core::int {
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.transformed.expect
index dba880e..0b269da 100644
--- a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension mixin on core::int* {
+extension mixin on core::int {
 }
-extension extension on core::int* {
+extension extension on core::int {
 }
-extension as on core::int* {
+extension as on core::int {
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart b/pkg/front_end/testcases/extensions/call_methods.dart
index d3db2f7..3ae8fe3 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart
+++ b/pkg/front_end/testcases/extensions/call_methods.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A {
   String get call => "My name is A";
 }
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline.expect
index fd2596a..cb13225 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A {
   String get call => "My name is A";
 }
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline_modelled.expect
index ac089e2..30be637 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 A a = new A();
 B b = new B();
 
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
index d38841f..4373c84 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -76,84 +76,64 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  get call() → core::String*
+  get call() → core::String
     return "My name is A";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  get call() → () →* core::String*
-    return () → core::String* => "My name is B";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get call() → () → core::String
+    return () → core::String => "My name is B";
 }
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   get call = self::_extension#0|get#call;
 }
-extension _extension#1 on core::num* {
+extension _extension#1 on core::num {
   get call = self::_extension#1|get#call;
 }
-extension _extension#2 on core::String* {
+extension _extension#2 on core::String {
   get call = self::_extension#2|get#call;
 }
-static field core::String* topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel1 = 1(10);
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.(10);
-static field core::String* topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel2 = 1(\"10\");
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.("10");
-static field core::String* topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel3 = 1.0(10);
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.(10);
-static field core::String* topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel4 = 1.0(\"10\");
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-static field self::A* a = new self::A::•();
+static field self::A a = new self::A::•();
 static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel5 = a(2);
                  ^";
-static field self::B* b = new self::B::•();
+static field self::B b = new self::B::•();
 static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel6 = a(2, \"3\");
                  ^";
-static method _extension#0|get#call(lowered final core::int* #this) → core::String*
+static method _extension#0|get#call(lowered final core::int #this) → core::String
   return "My name is int";
-static method _extension#1|get#call(lowered final core::num* #this) → core::String*
+static method _extension#1|get#call(lowered final core::num #this) → core::String
   return "My name is num";
-static method _extension#2|get#call(lowered final core::String* #this) → () →* core::String*
-  return () → core::String* => "My name is String";
+static method _extension#2|get#call(lowered final core::String #this) → () → core::String
+  return () → core::String => "My name is String";
 static method main() → dynamic {
-  self::_extension#2|get#call("")(){() →* core::String*};
+  self::_extension#2|get#call("")(){() → core::String};
 }
 static method errors() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
@@ -172,7 +152,7 @@
 Try removing the extra positional arguments.
   1.0(\"10\");
      ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-  self::A* a = new self::A::•();
+  self::A a = new self::A::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -183,7 +163,7 @@
 Try changing 'call' to a method or explicitly invoke 'call'.
   a(2, \"3\");
    ^";
-  self::B* b = new self::B::•();
+  self::B b = new self::B::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect
index d38841f..4373c84 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -76,84 +76,64 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  get call() → core::String*
+  get call() → core::String
     return "My name is A";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  get call() → () →* core::String*
-    return () → core::String* => "My name is B";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get call() → () → core::String
+    return () → core::String => "My name is B";
 }
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   get call = self::_extension#0|get#call;
 }
-extension _extension#1 on core::num* {
+extension _extension#1 on core::num {
   get call = self::_extension#1|get#call;
 }
-extension _extension#2 on core::String* {
+extension _extension#2 on core::String {
   get call = self::_extension#2|get#call;
 }
-static field core::String* topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel1 = 1(10);
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.(10);
-static field core::String* topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel2 = 1(\"10\");
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.("10");
-static field core::String* topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel3 = 1.0(10);
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.(10);
-static field core::String* topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel4 = 1.0(\"10\");
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-static field self::A* a = new self::A::•();
+static field self::A a = new self::A::•();
 static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel5 = a(2);
                  ^";
-static field self::B* b = new self::B::•();
+static field self::B b = new self::B::•();
 static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel6 = a(2, \"3\");
                  ^";
-static method _extension#0|get#call(lowered final core::int* #this) → core::String*
+static method _extension#0|get#call(lowered final core::int #this) → core::String
   return "My name is int";
-static method _extension#1|get#call(lowered final core::num* #this) → core::String*
+static method _extension#1|get#call(lowered final core::num #this) → core::String
   return "My name is num";
-static method _extension#2|get#call(lowered final core::String* #this) → () →* core::String*
-  return () → core::String* => "My name is String";
+static method _extension#2|get#call(lowered final core::String #this) → () → core::String
+  return () → core::String => "My name is String";
 static method main() → dynamic {
-  self::_extension#2|get#call("")(){() →* core::String*};
+  self::_extension#2|get#call("")(){() → core::String};
 }
 static method errors() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
@@ -172,7 +152,7 @@
 Try removing the extra positional arguments.
   1.0(\"10\");
      ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-  self::A* a = new self::A::•();
+  self::A a = new self::A::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -183,7 +163,7 @@
 Try changing 'call' to a method or explicitly invoke 'call'.
   a(2, \"3\");
    ^";
-  self::B* b = new self::B::•();
+  self::B b = new self::B::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
index 1745cce..88c97e4 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
@@ -1,61 +1,41 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     ;
-  get call() → core::String*
+  get call() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     ;
-  get call() → () →* core::String*
+  get call() → () → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   get call = self::_extension#0|get#call;
 }
-extension _extension#1 on core::num* {
+extension _extension#1 on core::num {
   get call = self::_extension#1|get#call;
 }
-extension _extension#2 on core::String* {
+extension _extension#2 on core::String {
   get call = self::_extension#2|get#call;
 }
-static field core::String* topLevel1;
-static field core::String* topLevel2;
-static field core::String* topLevel3;
-static field core::String* topLevel4;
-static field self::A* a;
+static field core::String topLevel1;
+static field core::String topLevel2;
+static field core::String topLevel3;
+static field core::String topLevel4;
+static field self::A a;
 static field invalid-type topLevel5;
-static field self::B* b;
+static field self::B b;
 static field invalid-type topLevel6;
-static method _extension#0|get#call(lowered final core::int* #this) → core::String*
+static method _extension#0|get#call(lowered final core::int #this) → core::String
   ;
-static method _extension#1|get#call(lowered final core::num* #this) → core::String*
+static method _extension#1|get#call(lowered final core::num #this) → core::String
   ;
-static method _extension#2|get#call(lowered final core::String* #this) → () →* core::String*
+static method _extension#2|get#call(lowered final core::String #this) → () → core::String
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
index d38841f..4373c84 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -76,84 +76,64 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  get call() → core::String*
+  get call() → core::String
     return "My name is A";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  get call() → () →* core::String*
-    return () → core::String* => "My name is B";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get call() → () → core::String
+    return () → core::String => "My name is B";
 }
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   get call = self::_extension#0|get#call;
 }
-extension _extension#1 on core::num* {
+extension _extension#1 on core::num {
   get call = self::_extension#1|get#call;
 }
-extension _extension#2 on core::String* {
+extension _extension#2 on core::String {
   get call = self::_extension#2|get#call;
 }
-static field core::String* topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel1 = 1(10);
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.(10);
-static field core::String* topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel2 = 1(\"10\");
                  ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.("10");
-static field core::String* topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel3 = 1.0(10);
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.(10);
-static field core::String* topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+static field core::String topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
 var topLevel4 = 1.0(\"10\");
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-static field self::A* a = new self::A::•();
+static field self::A a = new self::A::•();
 static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel5 = a(2);
                  ^";
-static field self::B* b = new self::B::•();
+static field self::B b = new self::B::•();
 static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel6 = a(2, \"3\");
                  ^";
-static method _extension#0|get#call(lowered final core::int* #this) → core::String*
+static method _extension#0|get#call(lowered final core::int #this) → core::String
   return "My name is int";
-static method _extension#1|get#call(lowered final core::num* #this) → core::String*
+static method _extension#1|get#call(lowered final core::num #this) → core::String
   return "My name is num";
-static method _extension#2|get#call(lowered final core::String* #this) → () →* core::String*
-  return () → core::String* => "My name is String";
+static method _extension#2|get#call(lowered final core::String #this) → () → core::String
+  return () → core::String => "My name is String";
 static method main() → dynamic {
-  self::_extension#2|get#call("")(){() →* core::String*};
+  self::_extension#2|get#call("")(){() → core::String};
 }
 static method errors() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
@@ -172,7 +152,7 @@
 Try removing the extra positional arguments.
   1.0(\"10\");
      ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
-  self::A* a = new self::A::•();
+  self::A a = new self::A::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -183,7 +163,7 @@
 Try changing 'call' to a method or explicitly invoke 'call'.
   a(2, \"3\");
    ^";
-  self::B* b = new self::B::•();
+  self::B b = new self::B::•();
   invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart b/pkg/front_end/testcases/extensions/check_bounds.dart
index bfa3795..0712bf2 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 part 'check_bounds_lib.dart';
 
 class A {}
@@ -17,25 +17,24 @@
 
 main() {}
 
-test() {
-  A a;
-
+test(A a) {
   Class<A> classA = new Class<A>();
+  Class<B> classB = new Class<B>();
+
   classA.method(); // Expect method not found.
   Extension(classA).method(); // Expect bounds mismatch.
   Extension<A>(classA).method(); // Expect bounds mismatch.
-  Extension<B>(classA).method();
+  Extension<B>(classB).method();
   Extension(classA).genericMethod(a); // Expect bounds mismatch.
   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
+  Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+  Extension<B>(classB).genericMethod<B>(a);
 
-  Class<B> classB = new Class<B>();
   classB.method();
   Extension(classB).method();
   Extension<A>(classB).method(); // Expect bounds mismatch.
@@ -57,6 +56,8 @@
 
 final A a = new A();
 final Class<A> classA = new Class<A>();
+final Class<B> classB = new Class<B>();
+
 final field1 = classA.method(); // Expect method not found.
 final field2 = Extension(classA).method(); // Expect bounds mismatch.
 final field3 = Extension<A>(classA).method(); // Expect bounds mismatch.
@@ -70,12 +71,11 @@
 final field10 =
     Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
 final field11 =
-    Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+    Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 final field12 =
-    Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-final field13 = Extension<B>(classA).genericMethod<B>(a);
+    Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+final field13 = Extension<B>(classB).genericMethod<B>(a);
 
-final Class<B> classB = new Class<B>();
 final field14 = classB.method();
 final field15 = Extension(classB).method();
 final field16 = Extension<A>(classB).method(); // Expect bounds mismatch.
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
index d3150dd..5374e92 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 part 'check_bounds_lib.dart';
 
 class A {}
@@ -13,9 +12,10 @@
 }
 
 main() {}
-test() {}
+test(A a) {}
 final A a = new A();
 final Class<A> classA = new Class<A>();
+final Class<B> classB = new Class<B>();
 final field1 = classA.method();
 final field2 = Extension(classA).method();
 final field3 = Extension<A>(classA).method();
@@ -26,10 +26,9 @@
 final field8 = Extension<A>(classA).genericMethod(a);
 final field9 = Extension<A>(classA).genericMethod<A>(a);
 final field10 = Extension<A>(classA).genericMethod<B>(a);
-final field11 = Extension<B>(classA).genericMethod(a);
-final field12 = Extension<B>(classA).genericMethod<A>(a);
-final field13 = Extension<B>(classA).genericMethod<B>(a);
-final Class<B> classB = new Class<B>();
+final field11 = Extension<B>(classB).genericMethod(a);
+final field12 = Extension<B>(classB).genericMethod<A>(a);
+final field13 = Extension<B>(classB).genericMethod<B>(a);
 final field14 = classB.method();
 final field15 = Extension(classB).method();
 final field16 = Extension<A>(classB).method();
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
index dbd1434..80266eb 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 part 'check_bounds_lib.dart';
 
 class A {}
@@ -17,9 +16,9 @@
 final Class<B> classB = new Class<B>();
 final field1 = classA.method();
 final field10 = Extension<A>(classA).genericMethod<B>(a);
-final field11 = Extension<B>(classA).genericMethod(a);
-final field12 = Extension<B>(classA).genericMethod<A>(a);
-final field13 = Extension<B>(classA).genericMethod<B>(a);
+final field11 = Extension<B>(classB).genericMethod(a);
+final field12 = Extension<B>(classB).genericMethod<A>(a);
+final field13 = Extension<B>(classB).genericMethod<B>(a);
 final field14 = classB.method();
 final field15 = Extension(classB).method();
 final field16 = Extension<A>(classB).method();
@@ -45,4 +44,4 @@
 final field8 = Extension<A>(classA).genericMethod(a);
 final field9 = Extension<A>(classA).genericMethod<A>(a);
 main() {}
-test() {}
+test(A a) {}
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
index 0e8aa01..530df36 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -69,6 +69,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:30:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -119,6 +125,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -133,7 +145,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -143,13 +155,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:41:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -159,7 +177,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -169,7 +187,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -179,7 +197,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -189,7 +213,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -199,7 +223,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -209,7 +239,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -219,7 +249,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -229,7 +259,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -239,7 +269,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:52:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -249,7 +285,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -259,7 +295,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -269,14 +305,20 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -286,7 +328,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -296,41 +338,28 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
+// final field4 = Extension<B>(classA).method();
+//                             ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -340,13 +369,39 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:66:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -356,7 +411,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -366,7 +421,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -376,7 +431,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -386,7 +441,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:71:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -396,26 +457,32 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:73:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:75:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field13 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -446,6 +513,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field20 = classB.genericMethod<B>(a);
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:87:35: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -466,6 +539,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field23 = Extension(classB).genericMethod<B>(a);
+//                                                    ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -506,6 +585,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -536,6 +621,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field29 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -603,6 +694,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -653,6 +750,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -667,7 +770,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -677,13 +780,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:28:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -693,7 +802,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:30:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -703,7 +812,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -713,7 +822,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:33:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -723,7 +838,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -733,7 +848,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -743,7 +864,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -753,7 +874,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -763,7 +884,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -773,7 +894,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -783,7 +910,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -793,7 +920,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -803,170 +930,243 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 
 part check_bounds_lib.dart;
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
-class Class<T extends self::A*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::A> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B> on self::Class<T> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   tearoff genericMethod = self::Extension|get#genericMethod;
 }
-static final field self::A* a = new self::A::•();
-static final field self::Class<self::A*>* classA = new self::Class::•<self::A*>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+static final field self::A a = new self::A::•();
+static final field self::Class<self::A> classA = new self::Class::•<self::A>();
+static final field self::Class<self::B> classB = new self::Class::•<self::B>();
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field3 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B*>(self::classA as{TypeError} self::Class<self::B*>*);
-static final field dynamic field5 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field6 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field8 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field9 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field11 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field12 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B*, self::B*>(self::classA as{TypeError} self::Class<self::B*>*, self::a as{TypeError} self::B*);
-static final field self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-static final field dynamic field14 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field15 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field16 = self::Extension|method<self::A*>(self::classB);
-static final field dynamic field17 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field19 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field21 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field22 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field24 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field25 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
-static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
-static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
-  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static final field dynamic field2 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field4 = Extension<B>(classA).method();
+                            ^" in self::classA as{TypeError,ForNonNullableByDefault} self::Class<self::B>);
+static final field dynamic field5 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field6 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field7 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                                  ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field13 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field14 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
+static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field20 = classB.genericMethod<B>(a);
+                                        ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field23 = Extension(classB).genericMethod<B>(a);
+                                                   ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field29 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
+static method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
+  return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
+static method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
+  return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
 static method main() → dynamic {}
-static method test() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method test(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
-static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect
index 0e8aa01..530df36 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -69,6 +69,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:30:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -119,6 +125,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -133,7 +145,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -143,13 +155,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:41:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -159,7 +177,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -169,7 +187,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -179,7 +197,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -189,7 +213,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -199,7 +223,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -209,7 +239,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -219,7 +249,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -229,7 +259,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -239,7 +269,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:52:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -249,7 +285,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -259,7 +295,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -269,14 +305,20 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -286,7 +328,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -296,41 +338,28 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
+// final field4 = Extension<B>(classA).method();
+//                             ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -340,13 +369,39 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:66:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -356,7 +411,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -366,7 +421,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -376,7 +431,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -386,7 +441,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:71:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -396,26 +457,32 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:73:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:75:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field13 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -446,6 +513,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field20 = classB.genericMethod<B>(a);
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:87:35: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -466,6 +539,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field23 = Extension(classB).genericMethod<B>(a);
+//                                                    ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -506,6 +585,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -536,6 +621,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field29 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -603,6 +694,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -653,6 +750,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -667,7 +770,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -677,13 +780,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:28:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -693,7 +802,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:30:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -703,7 +812,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -713,7 +822,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:33:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -723,7 +838,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -733,7 +848,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -743,7 +864,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -753,7 +874,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -763,7 +884,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -773,7 +894,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -783,7 +910,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -793,7 +920,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -803,170 +930,243 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 
 part check_bounds_lib.dart;
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
-class Class<T extends self::A*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::A> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B> on self::Class<T> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   tearoff genericMethod = self::Extension|get#genericMethod;
 }
-static final field self::A* a = new self::A::•();
-static final field self::Class<self::A*>* classA = new self::Class::•<self::A*>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+static final field self::A a = new self::A::•();
+static final field self::Class<self::A> classA = new self::Class::•<self::A>();
+static final field self::Class<self::B> classB = new self::Class::•<self::B>();
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field3 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B*>(self::classA as{TypeError} self::Class<self::B*>*);
-static final field dynamic field5 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field6 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field8 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field9 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field11 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field12 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B*, self::B*>(self::classA as{TypeError} self::Class<self::B*>*, self::a as{TypeError} self::B*);
-static final field self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-static final field dynamic field14 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field15 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field16 = self::Extension|method<self::A*>(self::classB);
-static final field dynamic field17 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field19 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field21 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field22 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field24 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field25 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
-static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
-static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
-  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static final field dynamic field2 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field4 = Extension<B>(classA).method();
+                            ^" in self::classA as{TypeError,ForNonNullableByDefault} self::Class<self::B>);
+static final field dynamic field5 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field6 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field7 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                                  ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field13 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field14 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
+static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field20 = classB.genericMethod<B>(a);
+                                        ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field23 = Extension(classB).genericMethod<B>(a);
+                                                   ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field29 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
+static method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
+  return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
+static method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
+  return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
 static method main() → dynamic {}
-static method test() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method test(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
-static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
index 22f598c..9a7437d 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
@@ -1,48 +1,29 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 part check_bounds_lib.dart;
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     ;
 }
-class Class<T extends self::A*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::A> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B> on self::Class<T> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   tearoff genericMethod = self::Extension|get#genericMethod;
 }
-static final field self::A* a;
-static final field self::Class<self::A*>* classA;
+static final field self::A a;
+static final field self::Class<self::A> classA;
+static final field self::Class<self::B> classB;
 static final field dynamic field1;
 static final field dynamic field2;
 static final field dynamic field3;
@@ -56,7 +37,6 @@
 static final field dynamic field11;
 static final field dynamic field12;
 static final field dynamic field13;
-static final field self::Class<self::B*>* classB;
 static final field dynamic field14;
 static final field dynamic field15;
 static final field dynamic field16;
@@ -73,17 +53,17 @@
 static final field dynamic field27;
 static final field dynamic field28;
 static final field dynamic field29;
-static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic
+static method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic
   ;
-static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic
+static method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
+  return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
+static method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic
   ;
-static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
-  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
+  return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
 static method main() → dynamic
   ;
-static method test() → dynamic
+static method test(self::A a) → dynamic
   ;
-static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart() → dynamic
+static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
index 0e8aa01..530df36 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -69,6 +69,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:30:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -119,6 +125,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -133,7 +145,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -143,13 +155,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:41:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -159,7 +177,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -169,7 +187,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:45:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -179,7 +197,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:46:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -189,7 +213,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:48:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -199,7 +223,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -209,7 +239,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:49:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -219,7 +249,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -229,7 +259,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -239,7 +269,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:52:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -249,7 +285,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -259,7 +295,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -269,14 +305,20 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 // final field1 = classA.method(); // Expect method not found.
 //                       ^^^^^^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:61:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -286,7 +328,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:63:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -296,41 +338,28 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
-// extension Extension<T extends B> on Class<T> {
-//                     ^
-//
-// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
-//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
-//                ^
-// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
-//   genericMethod<S extends B>(S s) {}
-//                 ^
+// final field4 = Extension<B>(classA).method();
+//                             ^
 //
 // pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -340,13 +369,39 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:66:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                                   ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
 //                ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -356,7 +411,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:68:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -366,7 +421,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -376,7 +431,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:70:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -386,7 +441,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:71:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:72:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -396,26 +457,32 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:73:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:74:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds.dart:75:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:76:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//     Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                          ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field13 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -446,6 +513,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field20 = classB.genericMethod<B>(a);
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:87:35: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -466,6 +539,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field23 = Extension(classB).genericMethod<B>(a);
+//                                                    ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -506,6 +585,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//     Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                           ^
+//
 // pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -536,6 +621,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// final field29 = Extension<B>(classB).genericMethod<B>(a);
+//                                                       ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -603,6 +694,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                      ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -653,6 +750,12 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
 // pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
@@ -667,7 +770,7 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
@@ -677,13 +780,19 @@
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
 //                        ^
 // pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:28:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:27:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -693,7 +802,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:30:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -703,7 +812,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -713,7 +822,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   classB.genericMethod<B>(a);
+//                           ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:33:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -723,7 +838,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -733,7 +848,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension(classB).genericMethod<B>(a);
+//                                      ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -743,7 +864,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:36:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -753,7 +874,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -763,7 +884,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -773,7 +894,13 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//                                         ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -783,7 +910,7 @@
 // extension Extension<T extends B> on Class<T> {
 //                     ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
@@ -793,7 +920,7 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
-// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -803,170 +930,243 @@
 //   genericMethod<S extends B>(S s) {}
 //                 ^
 //
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//   Extension<B>(classB).genericMethod<B>(a);
+//                                         ^
+//
 import self as self;
 import "dart:core" as core;
 
 part check_bounds_lib.dart;
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
 }
-class Class<T extends self::A*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::A> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B> on self::Class<T> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
   tearoff genericMethod = self::Extension|get#genericMethod;
 }
-static final field self::A* a = new self::A::•();
-static final field self::Class<self::A*>* classA = new self::Class::•<self::A*>();
-static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+static final field self::A a = new self::A::•();
+static final field self::Class<self::A> classA = new self::Class::•<self::A>();
+static final field self::Class<self::B> classB = new self::Class::•<self::B>();
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:61:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
 final field1 = classA.method(); // Expect method not found.
                       ^^^^^^" in self::classA{<unresolved>}.method();
-static final field dynamic field2 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field3 = self::Extension|method<self::A*>(self::classA);
-static final field dynamic field4 = self::Extension|method<self::B*>(self::classA as{TypeError} self::Class<self::B*>*);
-static final field dynamic field5 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field6 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field7 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field8 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field9 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
-static final field dynamic field10 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
-static final field dynamic field11 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field12 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
-static final field dynamic field13 = self::Extension|genericMethod<self::B*, self::B*>(self::classA as{TypeError} self::Class<self::B*>*, self::a as{TypeError} self::B*);
-static final field self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-static final field dynamic field14 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field15 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field16 = self::Extension|method<self::A*>(self::classB);
-static final field dynamic field17 = self::Extension|method<self::B*>(self::classB);
-static final field dynamic field18 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field19 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field20 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field21 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field22 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field23 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field24 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field25 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
-static final field dynamic field26 = self::Extension|genericMethod<self::A*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
-static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
-static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
-static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
-  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static final field dynamic field2 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field3 = self::Extension|method<self::A>(self::classA);
+static final field dynamic field4 = self::Extension|method<self::B>(invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:64:29: Error: The argument type 'Class<A>' can't be assigned to the parameter type 'Class<B>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field4 = Extension<B>(classA).method();
+                            ^" in self::classA as{TypeError,ForNonNullableByDefault} self::Class<self::B>);
+static final field dynamic field5 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field6 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field7 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:67:51: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                                  ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field8 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field9 = self::Extension|genericMethod<self::A, self::A>(self::classA, self::a);
+static final field dynamic field10 = self::Extension|genericMethod<self::A, self::B>(self::classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:72:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field11 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field12 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field13 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:77:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field13 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field14 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field15 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field16 = self::Extension|method<self::A>(self::classB);
+static final field dynamic field17 = self::Extension|method<self::B>(self::classB);
+static final field dynamic field18 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field19 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field20 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:86:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field20 = classB.genericMethod<B>(a);
+                                        ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field21 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field22 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field23 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:90:52: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field23 = Extension(classB).genericMethod<B>(a);
+                                                   ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field24 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field25 = self::Extension|genericMethod<self::A, self::A>(self::classB, self::a);
+static final field dynamic field26 = self::Extension|genericMethod<self::A, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:96:43: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+    Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                          ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static final field dynamic field27 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field28 = self::Extension|genericMethod<self::B, self::A>(self::classB, self::a);
+static final field dynamic field29 = self::Extension|genericMethod<self::B, self::B>(self::classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:101:55: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+final field29 = Extension<B>(classB).genericMethod<B>(a);
+                                                      ^" in self::a as{TypeError,ForNonNullableByDefault} self::B);
+static method Extension|method<T extends self::B>(lowered final self::Class<self::Extension|method::T> #this) → dynamic {}
+static method Extension|get#method<T extends self::B>(lowered final self::Class<self::Extension|get#method::T> #this) → () → dynamic
+  return () → dynamic => self::Extension|method<self::Extension|get#method::T>(#this);
+static method Extension|genericMethod<T extends self::B, S extends self::B>(lowered final self::Class<self::Extension|genericMethod::T> #this, self::Extension|genericMethod::S s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B>(lowered final self::Class<self::Extension|get#genericMethod::T> #this) → <S extends self::B>(S) → dynamic
+  return <S extends self::B>(S s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T, S>(#this, s);
 static method main() → dynamic {}
-static method test() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method test(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method(); // Expect method not found.
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:30:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:33:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:36:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:45:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:48:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:51:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:54:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
-static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart() → dynamic {
-  self::A* a;
-  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart(self::A a) → dynamic {
+  self::Class<self::A> classA = new self::Class::•<self::A>();
+  self::Class<self::B> classB = new self::Class::•<self::B>();
   invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   classA.method();
          ^^^^^^" in classA{<unresolved>}.method();
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::A*>(classA);
-  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
-  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|method<self::A*>(classB);
-  self::Extension|method<self::B*>(classB);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
-  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::A>(classA);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::A>(classA, a);
+  self::Extension|genericMethod<self::A, self::B>(classA, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:23:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|method<self::A>(classB);
+  self::Extension|method<self::B>(classB);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:27: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  classB.genericMethod<B>(a);
+                          ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:38: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension(classB).genericMethod<B>(a);
+                                     ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::A>(classB, a);
+  self::Extension|genericMethod<self::A, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::A>(classB, a);
+  self::Extension|genericMethod<self::B, self::B>(classB, invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:41: Error: The argument type 'A' can't be assigned to the parameter type 'B'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+  Extension<B>(classB).genericMethod<B>(a);
+                                        ^" in a as{TypeError,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/check_bounds_lib.dart b/pkg/front_end/testcases/extensions/check_bounds_lib.dart
index cf84769..47e8a2e 100644
--- a/pkg/front_end/testcases/extensions/check_bounds_lib.dart
+++ b/pkg/front_end/testcases/extensions/check_bounds_lib.dart
@@ -1,28 +1,27 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 part of 'check_bounds.dart';
 
-testInPart() {
-  A a;
-
+testInPart(A a) {
   Class<A> classA = new Class<A>();
+  Class<B> classB = new Class<B>();
+
   classA.method();
   Extension(classA).method(); // Expect bounds mismatch.
   Extension<A>(classA).method(); // Expect bounds mismatch.
-  Extension<B>(classA).method();
+  Extension<B>(classB).method();
   Extension(classA).genericMethod(a); // Expect bounds mismatch.
   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
-  Extension<B>(classA).genericMethod<B>(a);
+  Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
+  Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+  Extension<B>(classB).genericMethod<B>(a);
 
-  Class<B> classB = new Class<B>();
   classB.method();
   Extension(classB).method();
   Extension<A>(classB).method(); // Expect bounds mismatch.
diff --git a/pkg/front_end/testcases/extensions/compounds.dart b/pkg/front_end/testcases/extensions/compounds.dart
index af73621..3189665 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart
+++ b/pkg/front_end/testcases/extensions/compounds.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Number {
   final int value;
 
@@ -408,7 +408,7 @@
   expect(n0, IntClassExtension(v).property);
 }
 
-testExplicitNullAwareProperties(Class v) {
+testExplicitNullAwareProperties(Class? v) {
   Number n0 = new Number(0);
   Number n1 = new Number(1);
   Number n2 = new Number(2);
@@ -446,7 +446,7 @@
   expect(n0, ClassExtension(v)?.property, v == null);
 }
 
-testExplicitNullAwareIntProperties(IntClass v) {
+testExplicitNullAwareIntProperties(IntClass? v) {
   int n0 = 0;
   int n1 = 1;
   int n2 = 2;
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/compounds.dart.textual_outline.expect
index bb35225..89e856f 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Number {
   final int value;
   Number(this.value);
@@ -40,6 +39,6 @@
 testIntProperties() {}
 testExplicitProperties() {}
 testExplicitIntProperties() {}
-testExplicitNullAwareProperties(Class v) {}
-testExplicitNullAwareIntProperties(IntClass v) {}
+testExplicitNullAwareProperties(Class? v) {}
+testExplicitNullAwareIntProperties(IntClass? v) {}
 expect(expected, actual, [expectNull = false]) {}
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/compounds.dart.textual_outline_modelled.expect
index b845645..2ef5e18 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   Class(this.field);
   Number field;
@@ -38,8 +37,8 @@
 
 main() {}
 testExplicitIntProperties() {}
-testExplicitNullAwareIntProperties(IntClass v) {}
-testExplicitNullAwareProperties(Class v) {}
+testExplicitNullAwareIntProperties(IntClass? v) {}
+testExplicitNullAwareProperties(Class? v) {}
 testExplicitProperties() {}
 testIntProperties() {}
 testLocals() {}
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.weak.expect b/pkg/front_end/testcases/extensions/compounds.dart.weak.expect
index ccd5bd4..d1424bc 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.weak.expect
@@ -1,117 +1,90 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Number extends core::Object {
-  final field core::int* value;
-  constructor •(core::int* value) → self::Number*
+  final field core::int value;
+  constructor •(core::int value) → self::Number
     : self::Number::value = value, super core::Object::•()
     ;
-  get hashCode() → core::int*
-    return this.{self::Number::value}{core::int*}.{core::num::hashCode}{core::int*};
-  operator ==(core::Object* other) → core::bool*
-    return other is self::Number* && this.{self::Number::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Number*}.{self::Number::value}{core::int*};
-  method toString() → core::String*
-    return "Number(${this.{self::Number::value}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get hashCode() → core::int
+    return this.{self::Number::value}{core::int}.{core::num::hashCode}{core::int};
+  operator ==(core::Object other) → core::bool
+    return other is{ForNonNullableByDefault} self::Number && this.{self::Number::value}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Number}.{self::Number::value}{core::int};
+  method toString() → core::String
+    return "Number(${this.{self::Number::value}{core::int}})";
 }
 class Class extends core::Object {
-  field self::Number* field;
-  constructor •(self::Number* field) → self::Class*
+  field self::Number field;
+  constructor •(self::Number field) → self::Class
     : self::Class::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class IntClass extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::IntClass*
+  field core::int field;
+  constructor •(core::int field) → self::IntClass
     : self::IntClass::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension NumberExtension on self::Number* {
+extension NumberExtension on self::Number {
   operator + = self::NumberExtension|+;
   operator - = self::NumberExtension|-;
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   get property = self::ClassExtension|get#property;
   method testImplicitProperties = self::ClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
   set property = self::ClassExtension|set#property;
 }
-extension IntClassExtension on self::IntClass* {
+extension IntClassExtension on self::IntClass {
   get property = self::IntClassExtension|get#property;
   method testImplicitProperties = self::IntClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::IntClassExtension|get#testImplicitProperties;
   set property = self::IntClassExtension|set#property;
 }
-static method NumberExtension|+(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|+(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method NumberExtension|-(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|-(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method ClassExtension|get#property(lowered final self::Class* #this) → self::Number*
-  return #this.{self::Class::field}{self::Number*};
-static method ClassExtension|set#property(lowered final self::Class* #this, self::Number* value) → void {
+static method ClassExtension|get#property(lowered final self::Class #this) → self::Number
+  return #this.{self::Class::field}{self::Number};
+static method ClassExtension|set#property(lowered final self::Class #this, self::Number value) → void {
   #this.{self::Class::field} = value;
 }
-static method ClassExtension|testImplicitProperties(lowered final self::Class* #this) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
+static method ClassExtension|testImplicitProperties(lowered final self::Class #this) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
   self::expect(n0, self::ClassExtension|get#property(#this));
-  self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
-  self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
-  self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
-  self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
-  self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
-  self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
-  self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final self::Number* #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final self::Number* #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n1, let final self::Number #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
+  self::expect(n2, let final self::Number #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
+  self::expect(n0, let final self::Number #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
+  self::expect(n1, let final self::Number #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
+  self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
+  self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
+  self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -124,58 +97,58 @@
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
   self::expect(n0, self::ClassExtension|get#property(#this));
-  let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
+  let final self::Number #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
   self::expect(n1, self::ClassExtension|get#property(#this));
-  let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
+  let final self::Number #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
   self::expect(n0, self::ClassExtension|get#property(#this));
 }
-static method ClassExtension|get#testImplicitProperties(lowered final self::Class* #this) → () →* dynamic
+static method ClassExtension|get#testImplicitProperties(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
-static method IntClassExtension|get#property(lowered final self::IntClass* #this) → core::int*
-  return #this.{self::IntClass::field}{core::int*};
-static method IntClassExtension|set#property(lowered final self::IntClass* #this, core::int* value) → void {
+static method IntClassExtension|get#property(lowered final self::IntClass #this) → core::int
+  return #this.{self::IntClass::field}{core::int};
+static method IntClassExtension|set#property(lowered final self::IntClass #this, core::int value) → void {
   #this.{self::IntClass::field} = value;
 }
-static method IntClassExtension|testImplicitProperties(lowered final self::IntClass* #this) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
+static method IntClassExtension|testImplicitProperties(lowered final self::IntClass #this) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::expect(n1, let final core::int* #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
-  self::expect(n2, let final core::int* #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
-  self::expect(n0, let final core::int* #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
-  self::expect(n1, let final core::int* #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
-  self::expect(n0, let final core::int* #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
-  self::expect(n1, let final core::int* #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
-  self::expect(n0, let final core::int* #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int* #t37 = self::IntClassExtension|get#property(#this) in let final core::int* #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num*) →* core::int*}) in #t37);
-  self::expect(n1, let final core::int* #t39 = self::IntClassExtension|get#property(#this) in let final core::int* #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num*) →* core::int*}) in #t39);
+  self::expect(n1, let final core::int #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
+  self::expect(n2, let final core::int #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
+  self::expect(n0, let final core::int #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
+  self::expect(n1, let final core::int #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
+  self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
+  self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
+  self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  let final core::int* #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
+  let final core::int #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  let final core::int* #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
+  let final core::int #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
 }
-static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass* #this) → () →* dynamic
+static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass #this) → () → dynamic
   return () → dynamic => self::IntClassExtension|testImplicitProperties(#this);
 static method main() → dynamic {
   self::testLocals();
@@ -191,10 +164,10 @@
   self::IntClassExtension|testImplicitProperties(new self::IntClass::•(0));
 }
 static method testLocals() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Number* v = n0;
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Number v = n0;
   self::expect(n0, v);
   self::expect(n1, v = self::NumberExtension|+(v, n1));
   self::expect(n2, v = self::NumberExtension|+(v, n1));
@@ -203,8 +176,8 @@
   self::expect(n0, v = self::NumberExtension|-(v, n1));
   self::expect(n1, v = self::NumberExtension|+(v, 1));
   self::expect(n0, v = self::NumberExtension|-(v, 1));
-  self::expect(n0, let final self::Number* #t45 = v in let final self::Number* #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
-  self::expect(n1, let final self::Number* #t47 = v in let final self::Number* #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
+  self::expect(n0, let final self::Number #t45 = v in let final self::Number #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
+  self::expect(n1, let final self::Number #t47 = v in let final self::Number #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
   self::expect(n0, v);
   self::expect(n0, v);
   v = self::NumberExtension|+(v, n1);
@@ -227,284 +200,284 @@
   self::expect(n0, v);
 }
 static method testProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n1, let final self::Class* #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number*}, n1));
-  self::expect(n2, let final self::Class* #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number*}, n2));
-  self::expect(n1, let final self::Class* #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number*}, n1));
-  self::expect(n1, let final self::Class* #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t56 = v in let final self::Number* #t57 = #t56.{self::Class::field}{self::Number*} in let final self::Number* #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
-  self::expect(n1, let final self::Class* #t59 = v in let final self::Number* #t60 = #t59.{self::Class::field}{self::Number*} in let final self::Number* #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number*}, n1);
-  self::expect(n2, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number*}, n2);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number*}, n1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n1, let final self::Class #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number}, n1));
+  self::expect(n2, let final self::Class #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number}, n2));
+  self::expect(n1, let final self::Class #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number}, n1));
+  self::expect(n1, let final self::Class #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t56 = v in let final self::Number #t57 = #t56.{self::Class::field}{self::Number} in let final self::Number #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
+  self::expect(n1, let final self::Class #t59 = v in let final self::Number #t60 = #t59.{self::Class::field}{self::Number} in let final self::Number #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number}, n1);
+  self::expect(n2, v.{self::Class::field}{self::Number});
+  let final self::Class #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number}, n2);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number}, n1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t71 = v in let final self::Number* #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
-  self::expect(n2, let final self::Class* #t74 = v in let final self::Number* #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
-  self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
-  self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
-  self::expect(n0, let final self::Class* #t83 = v in let final self::Number* #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
-  self::expect(n1, let final self::Class* #t86 = v in let final self::Number* #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
-  self::expect(n0, let final self::Class* #t89 = v in let final self::Number* #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
-  self::expect(n0, let final self::Class* #t92 = v in let final self::Number* #t93 = self::ClassExtension|get#property(#t92) in let final self::Number* #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
-  self::expect(n1, let final self::Class* #t95 = v in let final self::Number* #t96 = self::ClassExtension|get#property(#t95) in let final self::Number* #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
+  self::expect(n1, let final self::Class #t71 = v in let final self::Number #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
+  self::expect(n2, let final self::Class #t74 = v in let final self::Number #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
+  self::expect(n0, let final self::Class #t77 = v in let final self::Number #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
+  self::expect(n1, let final self::Class #t80 = v in let final self::Number #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
+  self::expect(n0, let final self::Class #t83 = v in let final self::Number #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
+  self::expect(n1, let final self::Class #t86 = v in let final self::Number #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
+  self::expect(n0, let final self::Class #t89 = v in let final self::Number #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
+  self::expect(n0, let final self::Class #t92 = v in let final self::Number #t93 = self::ClassExtension|get#property(#t92) in let final self::Number #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
+  self::expect(n1, let final self::Class #t95 = v in let final self::Number #t96 = self::ClassExtension|get#property(#t95) in let final self::Number #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
+  let final self::Class #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
+  let final self::Class #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
+  let final self::Class #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
+  let final self::Class #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
+  let final self::Class #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t103 = v in let final self::Number* #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
+  let final self::Class #t103 = v in let final self::Number #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t106 = v in let final self::Number* #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
+  let final self::Class #t106 = v in let final self::Number #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
+  let final self::Class #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
+  let final self::Class #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n1, let final self::IntClass* #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t118 = v in let final core::int* #t119 = #t118.{self::IntClass::field}{core::int*} in let final core::int* #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num*) →* core::int*} in #t119);
-  self::expect(n1, let final self::IntClass* #t121 = v in let final core::int* #t122 = #t121.{self::IntClass::field}{core::int*} in let final core::int* #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num*) →* core::int*} in #t122);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n2, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n1, let final self::IntClass #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t118 = v in let final core::int #t119 = #t118.{self::IntClass::field}{core::int} in let final core::int #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num) → core::int} in #t119);
+  self::expect(n1, let final self::IntClass #t121 = v in let final core::int #t122 = #t121.{self::IntClass::field}{core::int} in let final core::int #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num) → core::int} in #t122);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n2, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t133 = v in let final core::int* #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
-  self::expect(n2, let final self::IntClass* #t136 = v in let final core::int* #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
-  self::expect(n0, let final self::IntClass* #t139 = v in let final core::int* #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
-  self::expect(n1, let final self::IntClass* #t142 = v in let final core::int* #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
-  self::expect(n0, let final self::IntClass* #t145 = v in let final core::int* #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
-  self::expect(n1, let final self::IntClass* #t148 = v in let final core::int* #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
-  self::expect(n0, let final self::IntClass* #t151 = v in let final core::int* #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
-  self::expect(n0, let final self::IntClass* #t154 = v in let final core::int* #t155 = self::IntClassExtension|get#property(#t154) in let final core::int* #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num*) →* core::int*}) in #t155);
-  self::expect(n1, let final self::IntClass* #t157 = v in let final core::int* #t158 = self::IntClassExtension|get#property(#t157) in let final core::int* #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num*) →* core::int*}) in #t158);
+  self::expect(n1, let final self::IntClass #t133 = v in let final core::int #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num) → core::int} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
+  self::expect(n2, let final self::IntClass #t136 = v in let final core::int #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num) → core::int} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
+  self::expect(n0, let final self::IntClass #t139 = v in let final core::int #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num) → core::int} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
+  self::expect(n1, let final self::IntClass #t142 = v in let final core::int #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num) → core::int} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
+  self::expect(n0, let final self::IntClass #t145 = v in let final core::int #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num) → core::int} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
+  self::expect(n1, let final self::IntClass #t148 = v in let final core::int #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num) → core::int} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
+  self::expect(n0, let final self::IntClass #t151 = v in let final core::int #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num) → core::int} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
+  self::expect(n0, let final self::IntClass #t154 = v in let final core::int #t155 = self::IntClassExtension|get#property(#t154) in let final core::int #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num) → core::int}) in #t155);
+  self::expect(n1, let final self::IntClass #t157 = v in let final core::int #t158 = self::IntClassExtension|get#property(#t157) in let final core::int #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num) → core::int}) in #t158);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t165 = v in let final core::int* #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
+  let final self::IntClass #t165 = v in let final core::int #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num) → core::int} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t168 = v in let final core::int* #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
+  let final self::IntClass #t168 = v in let final core::int #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num) → core::int} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t173 = v in let final self::Number* #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
-  self::expect(n2, let final self::Class* #t176 = v in let final self::Number* #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
-  self::expect(n0, let final self::Class* #t179 = v in let final self::Number* #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
-  self::expect(n1, let final self::Class* #t182 = v in let final self::Number* #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
-  self::expect(n0, let final self::Class* #t185 = v in let final self::Number* #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
-  self::expect(n1, let final self::Class* #t188 = v in let final self::Number* #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
-  self::expect(n0, let final self::Class* #t191 = v in let final self::Number* #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class* #t194 = v in let final self::Number* #t195 = self::ClassExtension|get#property(#t194) in let final self::Number* #t196 = let final self::Number* #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class* #t199 = v in let final self::Number* #t200 = self::ClassExtension|get#property(#t199) in let final self::Number* #t201 = let final self::Number* #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n1, let final self::Class #t173 = v in let final self::Number #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
+  self::expect(n2, let final self::Class #t176 = v in let final self::Number #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
+  self::expect(n0, let final self::Class #t179 = v in let final self::Number #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
+  self::expect(n1, let final self::Class #t182 = v in let final self::Number #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
+  self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
+  self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
+  self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
+  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t209 = v in let final self::Number* #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t212 = v in let final self::Number* #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t217 = v in let final core::int* #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass* #t220 = v in let final core::int* #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass* #t223 = v in let final core::int* #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass* #t226 = v in let final core::int* #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass* #t229 = v in let final core::int* #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass* #t232 = v in let final core::int* #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass* #t235 = v in let final core::int* #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass* #t238 = v in let final core::int* #t239 = self::IntClassExtension|get#property(#t238) in let final core::int* #t240 = let final core::int* #t241 = #t239.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass* #t243 = v in let final core::int* #t244 = self::IntClassExtension|get#property(#t243) in let final core::int* #t245 = let final core::int* #t246 = #t244.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
+  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
+  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
+  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
+  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
+  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
+  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
+  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
+  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t253 = v in let final core::int* #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t256 = v in let final core::int* #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
-static method testExplicitNullAwareProperties(self::Class* v) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class* #t261 = v in #t261 == null ?{self::Number*} null : self::ClassExtension|get#property(#t261), v == null);
-  self::expect(n1, let final self::Class* #t262 = v in #t262 == null ?{self::Number*} null : let final self::Number* #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262), n1) in let final void #t264 = self::ClassExtension|set#property(#t262, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class* #t265 = v in #t265 == null ?{self::Number*} null : let final self::Number* #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265), n1) in let final void #t267 = self::ClassExtension|set#property(#t265, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class* #t268 = v in #t268 == null ?{self::Number*} null : let final self::Number* #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268), n2) in let final void #t270 = self::ClassExtension|set#property(#t268, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class* #t271 = v in #t271 == null ?{self::Number*} null : let final self::Number* #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271), n1) in let final void #t273 = self::ClassExtension|set#property(#t271, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class* #t274 = v in #t274 == null ?{self::Number*} null : let final self::Number* #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274), n1) in let final void #t276 = self::ClassExtension|set#property(#t274, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class* #t277 = v in #t277 == null ?{self::Number*} null : let final self::Number* #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277), 1) in let final void #t279 = self::ClassExtension|set#property(#t277, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class* #t280 = v in #t280 == null ?{self::Number*} null : let final self::Number* #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280), 1) in let final void #t282 = self::ClassExtension|set#property(#t280, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class* #t283 = v in #t283 == null ?{self::Number*} null : let final self::Number* #t284 = self::ClassExtension|get#property(#t283) in let final self::Number* #t285 = let final self::Number* #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class* #t288 = v in #t288 == null ?{self::Number*} null : let final self::Number* #t289 = self::ClassExtension|get#property(#t288) in let final self::Number* #t290 = let final self::Number* #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class* #t293 = v in #t293 == null ?{self::Number*} null : self::ClassExtension|get#property(#t293), v == null);
-  self::expect(n0, let final self::Class* #t294 = v in #t294 == null ?{self::Number*} null : self::ClassExtension|get#property(#t294), v == null);
-  let final self::Class* #t295 = v in #t295 == null ?{self::Number*} null : self::ClassExtension|set#property(#t295, self::NumberExtension|+(self::ClassExtension|get#property(#t295), n1));
-  self::expect(n1, let final self::Class* #t296 = v in #t296 == null ?{self::Number*} null : self::ClassExtension|get#property(#t296), v == null);
-  let final self::Class* #t297 = v in #t297 == null ?{self::Number*} null : self::ClassExtension|set#property(#t297, self::NumberExtension|+(self::ClassExtension|get#property(#t297), n1));
-  self::expect(n2, let final self::Class* #t298 = v in #t298 == null ?{self::Number*} null : self::ClassExtension|get#property(#t298), v == null);
-  let final self::Class* #t299 = v in #t299 == null ?{self::Number*} null : self::ClassExtension|set#property(#t299, self::NumberExtension|-(self::ClassExtension|get#property(#t299), n2));
-  self::expect(n0, let final self::Class* #t300 = v in #t300 == null ?{self::Number*} null : self::ClassExtension|get#property(#t300), v == null);
-  let final self::Class* #t301 = v in #t301 == null ?{self::Number*} null : self::ClassExtension|set#property(#t301, self::NumberExtension|+(self::ClassExtension|get#property(#t301), n1));
-  self::expect(n1, let final self::Class* #t302 = v in #t302 == null ?{self::Number*} null : self::ClassExtension|get#property(#t302), v == null);
-  let final self::Class* #t303 = v in #t303 == null ?{self::Number*} null : self::ClassExtension|set#property(#t303, self::NumberExtension|-(self::ClassExtension|get#property(#t303), n1));
-  self::expect(n0, let final self::Class* #t304 = v in #t304 == null ?{self::Number*} null : self::ClassExtension|get#property(#t304), v == null);
-  let final self::Class* #t305 = v in #t305 == null ?{self::Number*} null : let final self::Number* #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305), 1) in let final void #t307 = self::ClassExtension|set#property(#t305, #t306) in #t306;
-  self::expect(n1, let final self::Class* #t308 = v in #t308 == null ?{self::Number*} null : self::ClassExtension|get#property(#t308), v == null);
-  let final self::Class* #t309 = v in #t309 == null ?{self::Number*} null : let final self::Number* #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309), 1) in let final void #t311 = self::ClassExtension|set#property(#t309, #t310) in #t310;
-  self::expect(n0, let final self::Class* #t312 = v in #t312 == null ?{self::Number*} null : self::ClassExtension|get#property(#t312), v == null);
-  let final self::Class* #t313 = v in #t313 == null ?{self::Number*} null : self::ClassExtension|set#property(#t313, self::NumberExtension|+(self::ClassExtension|get#property(#t313), 1));
-  self::expect(n1, let final self::Class* #t314 = v in #t314 == null ?{self::Number*} null : self::ClassExtension|get#property(#t314), v == null);
-  let final self::Class* #t315 = v in #t315 == null ?{self::Number*} null : self::ClassExtension|set#property(#t315, self::NumberExtension|-(self::ClassExtension|get#property(#t315), 1));
-  self::expect(n0, let final self::Class* #t316 = v in #t316 == null ?{self::Number*} null : self::ClassExtension|get#property(#t316), v == null);
+static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
+  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
+  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
+  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
+  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
+  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
+  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
+  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
+  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
+  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
+  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
+  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
+  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
+  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
+  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
+  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
+  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
+  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
+  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
+  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
-static method testExplicitNullAwareIntProperties(self::IntClass* v) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::expect(n0, let final self::IntClass* #t317 = v in #t317 == null ?{core::int*} null : self::IntClassExtension|get#property(#t317), v == null);
-  self::expect(n1, let final self::IntClass* #t318 = v in #t318 == null ?{core::int*} null : let final core::int* #t319 = self::IntClassExtension|get#property(#t318).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t320 = self::IntClassExtension|set#property(#t318, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass* #t321 = v in #t321 == null ?{core::int*} null : let final core::int* #t322 = self::IntClassExtension|get#property(#t321).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t323 = self::IntClassExtension|set#property(#t321, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass* #t324 = v in #t324 == null ?{core::int*} null : let final core::int* #t325 = self::IntClassExtension|get#property(#t324).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t326 = self::IntClassExtension|set#property(#t324, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass* #t327 = v in #t327 == null ?{core::int*} null : let final core::int* #t328 = self::IntClassExtension|get#property(#t327).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t329 = self::IntClassExtension|set#property(#t327, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass* #t330 = v in #t330 == null ?{core::int*} null : let final core::int* #t331 = self::IntClassExtension|get#property(#t330).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t332 = self::IntClassExtension|set#property(#t330, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass* #t333 = v in #t333 == null ?{core::int*} null : let final core::int* #t334 = self::IntClassExtension|get#property(#t333).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t335 = self::IntClassExtension|set#property(#t333, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass* #t336 = v in #t336 == null ?{core::int*} null : let final core::int* #t337 = self::IntClassExtension|get#property(#t336).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t338 = self::IntClassExtension|set#property(#t336, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass* #t339 = v in #t339 == null ?{core::int*} null : let final core::int* #t340 = self::IntClassExtension|get#property(#t339) in let final core::int* #t341 = let final core::int* #t342 = #t340.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t343 = self::IntClassExtension|set#property(#t339, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass* #t344 = v in #t344 == null ?{core::int*} null : let final core::int* #t345 = self::IntClassExtension|get#property(#t344) in let final core::int* #t346 = let final core::int* #t347 = #t345.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t348 = self::IntClassExtension|set#property(#t344, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass* #t349 = v in #t349 == null ?{core::int*} null : self::IntClassExtension|get#property(#t349), v == null);
-  self::expect(n0, let final self::IntClass* #t350 = v in #t350 == null ?{core::int*} null : self::IntClassExtension|get#property(#t350), v == null);
-  let final self::IntClass* #t351 = v in #t351 == null ?{core::int*} null : self::IntClassExtension|set#property(#t351, self::IntClassExtension|get#property(#t351).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t352 = v in #t352 == null ?{core::int*} null : self::IntClassExtension|get#property(#t352), v == null);
-  let final self::IntClass* #t353 = v in #t353 == null ?{core::int*} null : self::IntClassExtension|set#property(#t353, self::IntClassExtension|get#property(#t353).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t354 = v in #t354 == null ?{core::int*} null : self::IntClassExtension|get#property(#t354), v == null);
-  let final self::IntClass* #t355 = v in #t355 == null ?{core::int*} null : self::IntClassExtension|set#property(#t355, self::IntClassExtension|get#property(#t355).{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t356 = v in #t356 == null ?{core::int*} null : self::IntClassExtension|get#property(#t356), v == null);
-  let final self::IntClass* #t357 = v in #t357 == null ?{core::int*} null : self::IntClassExtension|set#property(#t357, self::IntClassExtension|get#property(#t357).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t358 = v in #t358 == null ?{core::int*} null : self::IntClassExtension|get#property(#t358), v == null);
-  let final self::IntClass* #t359 = v in #t359 == null ?{core::int*} null : self::IntClassExtension|set#property(#t359, self::IntClassExtension|get#property(#t359).{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t360 = v in #t360 == null ?{core::int*} null : self::IntClassExtension|get#property(#t360), v == null);
-  let final self::IntClass* #t361 = v in #t361 == null ?{core::int*} null : let final core::int* #t362 = self::IntClassExtension|get#property(#t361).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t363 = self::IntClassExtension|set#property(#t361, #t362) in #t362;
-  self::expect(n1, let final self::IntClass* #t364 = v in #t364 == null ?{core::int*} null : self::IntClassExtension|get#property(#t364), v == null);
-  let final self::IntClass* #t365 = v in #t365 == null ?{core::int*} null : let final core::int* #t366 = self::IntClassExtension|get#property(#t365).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t367 = self::IntClassExtension|set#property(#t365, #t366) in #t366;
-  self::expect(n0, let final self::IntClass* #t368 = v in #t368 == null ?{core::int*} null : self::IntClassExtension|get#property(#t368), v == null);
-  let final self::IntClass* #t369 = v in #t369 == null ?{core::int*} null : self::IntClassExtension|set#property(#t369, self::IntClassExtension|get#property(#t369).{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t370 = v in #t370 == null ?{core::int*} null : self::IntClassExtension|get#property(#t370), v == null);
-  let final self::IntClass* #t371 = v in #t371 == null ?{core::int*} null : self::IntClassExtension|set#property(#t371, self::IntClassExtension|get#property(#t371).{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t372 = v in #t372 == null ?{core::int*} null : self::IntClassExtension|get#property(#t372), v == null);
+static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
+  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
+  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
+  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
+  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
+  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
+  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
+  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
+  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
+  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
+  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
+  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
+  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
+  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
+  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
+  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
-  if(expectNull as{TypeError,ForDynamic} core::bool*) {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
     expected = null;
   }
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect
index ccd5bd4..d1424bc 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect
@@ -1,117 +1,90 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Number extends core::Object {
-  final field core::int* value;
-  constructor •(core::int* value) → self::Number*
+  final field core::int value;
+  constructor •(core::int value) → self::Number
     : self::Number::value = value, super core::Object::•()
     ;
-  get hashCode() → core::int*
-    return this.{self::Number::value}{core::int*}.{core::num::hashCode}{core::int*};
-  operator ==(core::Object* other) → core::bool*
-    return other is self::Number* && this.{self::Number::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Number*}.{self::Number::value}{core::int*};
-  method toString() → core::String*
-    return "Number(${this.{self::Number::value}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get hashCode() → core::int
+    return this.{self::Number::value}{core::int}.{core::num::hashCode}{core::int};
+  operator ==(core::Object other) → core::bool
+    return other is{ForNonNullableByDefault} self::Number && this.{self::Number::value}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Number}.{self::Number::value}{core::int};
+  method toString() → core::String
+    return "Number(${this.{self::Number::value}{core::int}})";
 }
 class Class extends core::Object {
-  field self::Number* field;
-  constructor •(self::Number* field) → self::Class*
+  field self::Number field;
+  constructor •(self::Number field) → self::Class
     : self::Class::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class IntClass extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::IntClass*
+  field core::int field;
+  constructor •(core::int field) → self::IntClass
     : self::IntClass::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension NumberExtension on self::Number* {
+extension NumberExtension on self::Number {
   operator + = self::NumberExtension|+;
   operator - = self::NumberExtension|-;
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   get property = self::ClassExtension|get#property;
   method testImplicitProperties = self::ClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
   set property = self::ClassExtension|set#property;
 }
-extension IntClassExtension on self::IntClass* {
+extension IntClassExtension on self::IntClass {
   get property = self::IntClassExtension|get#property;
   method testImplicitProperties = self::IntClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::IntClassExtension|get#testImplicitProperties;
   set property = self::IntClassExtension|set#property;
 }
-static method NumberExtension|+(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|+(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method NumberExtension|-(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|-(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method ClassExtension|get#property(lowered final self::Class* #this) → self::Number*
-  return #this.{self::Class::field}{self::Number*};
-static method ClassExtension|set#property(lowered final self::Class* #this, self::Number* value) → void {
+static method ClassExtension|get#property(lowered final self::Class #this) → self::Number
+  return #this.{self::Class::field}{self::Number};
+static method ClassExtension|set#property(lowered final self::Class #this, self::Number value) → void {
   #this.{self::Class::field} = value;
 }
-static method ClassExtension|testImplicitProperties(lowered final self::Class* #this) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
+static method ClassExtension|testImplicitProperties(lowered final self::Class #this) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
   self::expect(n0, self::ClassExtension|get#property(#this));
-  self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
-  self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
-  self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
-  self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
-  self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
-  self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
-  self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final self::Number* #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final self::Number* #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n1, let final self::Number #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
+  self::expect(n2, let final self::Number #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
+  self::expect(n0, let final self::Number #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
+  self::expect(n1, let final self::Number #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
+  self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
+  self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
+  self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -124,58 +97,58 @@
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
   self::expect(n0, self::ClassExtension|get#property(#this));
-  let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
+  let final self::Number #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
   self::expect(n1, self::ClassExtension|get#property(#this));
-  let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
+  let final self::Number #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
   self::expect(n0, self::ClassExtension|get#property(#this));
 }
-static method ClassExtension|get#testImplicitProperties(lowered final self::Class* #this) → () →* dynamic
+static method ClassExtension|get#testImplicitProperties(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
-static method IntClassExtension|get#property(lowered final self::IntClass* #this) → core::int*
-  return #this.{self::IntClass::field}{core::int*};
-static method IntClassExtension|set#property(lowered final self::IntClass* #this, core::int* value) → void {
+static method IntClassExtension|get#property(lowered final self::IntClass #this) → core::int
+  return #this.{self::IntClass::field}{core::int};
+static method IntClassExtension|set#property(lowered final self::IntClass #this, core::int value) → void {
   #this.{self::IntClass::field} = value;
 }
-static method IntClassExtension|testImplicitProperties(lowered final self::IntClass* #this) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
+static method IntClassExtension|testImplicitProperties(lowered final self::IntClass #this) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::expect(n1, let final core::int* #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
-  self::expect(n2, let final core::int* #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
-  self::expect(n0, let final core::int* #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
-  self::expect(n1, let final core::int* #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
-  self::expect(n0, let final core::int* #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
-  self::expect(n1, let final core::int* #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
-  self::expect(n0, let final core::int* #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int* #t37 = self::IntClassExtension|get#property(#this) in let final core::int* #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num*) →* core::int*}) in #t37);
-  self::expect(n1, let final core::int* #t39 = self::IntClassExtension|get#property(#this) in let final core::int* #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num*) →* core::int*}) in #t39);
+  self::expect(n1, let final core::int #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
+  self::expect(n2, let final core::int #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
+  self::expect(n0, let final core::int #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
+  self::expect(n1, let final core::int #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
+  self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
+  self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
+  self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  let final core::int* #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
+  let final core::int #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  let final core::int* #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
+  let final core::int #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
 }
-static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass* #this) → () →* dynamic
+static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass #this) → () → dynamic
   return () → dynamic => self::IntClassExtension|testImplicitProperties(#this);
 static method main() → dynamic {
   self::testLocals();
@@ -191,10 +164,10 @@
   self::IntClassExtension|testImplicitProperties(new self::IntClass::•(0));
 }
 static method testLocals() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Number* v = n0;
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Number v = n0;
   self::expect(n0, v);
   self::expect(n1, v = self::NumberExtension|+(v, n1));
   self::expect(n2, v = self::NumberExtension|+(v, n1));
@@ -203,8 +176,8 @@
   self::expect(n0, v = self::NumberExtension|-(v, n1));
   self::expect(n1, v = self::NumberExtension|+(v, 1));
   self::expect(n0, v = self::NumberExtension|-(v, 1));
-  self::expect(n0, let final self::Number* #t45 = v in let final self::Number* #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
-  self::expect(n1, let final self::Number* #t47 = v in let final self::Number* #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
+  self::expect(n0, let final self::Number #t45 = v in let final self::Number #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
+  self::expect(n1, let final self::Number #t47 = v in let final self::Number #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
   self::expect(n0, v);
   self::expect(n0, v);
   v = self::NumberExtension|+(v, n1);
@@ -227,284 +200,284 @@
   self::expect(n0, v);
 }
 static method testProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n1, let final self::Class* #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number*}, n1));
-  self::expect(n2, let final self::Class* #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number*}, n2));
-  self::expect(n1, let final self::Class* #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number*}, n1));
-  self::expect(n1, let final self::Class* #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t56 = v in let final self::Number* #t57 = #t56.{self::Class::field}{self::Number*} in let final self::Number* #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
-  self::expect(n1, let final self::Class* #t59 = v in let final self::Number* #t60 = #t59.{self::Class::field}{self::Number*} in let final self::Number* #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number*}, n1);
-  self::expect(n2, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number*}, n2);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number*}, n1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n1, let final self::Class #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number}, n1));
+  self::expect(n2, let final self::Class #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number}, n2));
+  self::expect(n1, let final self::Class #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number}, n1));
+  self::expect(n1, let final self::Class #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t56 = v in let final self::Number #t57 = #t56.{self::Class::field}{self::Number} in let final self::Number #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
+  self::expect(n1, let final self::Class #t59 = v in let final self::Number #t60 = #t59.{self::Class::field}{self::Number} in let final self::Number #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number}, n1);
+  self::expect(n2, v.{self::Class::field}{self::Number});
+  let final self::Class #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number}, n2);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number}, n1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t71 = v in let final self::Number* #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
-  self::expect(n2, let final self::Class* #t74 = v in let final self::Number* #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
-  self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
-  self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
-  self::expect(n0, let final self::Class* #t83 = v in let final self::Number* #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
-  self::expect(n1, let final self::Class* #t86 = v in let final self::Number* #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
-  self::expect(n0, let final self::Class* #t89 = v in let final self::Number* #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
-  self::expect(n0, let final self::Class* #t92 = v in let final self::Number* #t93 = self::ClassExtension|get#property(#t92) in let final self::Number* #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
-  self::expect(n1, let final self::Class* #t95 = v in let final self::Number* #t96 = self::ClassExtension|get#property(#t95) in let final self::Number* #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
+  self::expect(n1, let final self::Class #t71 = v in let final self::Number #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
+  self::expect(n2, let final self::Class #t74 = v in let final self::Number #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
+  self::expect(n0, let final self::Class #t77 = v in let final self::Number #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
+  self::expect(n1, let final self::Class #t80 = v in let final self::Number #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
+  self::expect(n0, let final self::Class #t83 = v in let final self::Number #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
+  self::expect(n1, let final self::Class #t86 = v in let final self::Number #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
+  self::expect(n0, let final self::Class #t89 = v in let final self::Number #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
+  self::expect(n0, let final self::Class #t92 = v in let final self::Number #t93 = self::ClassExtension|get#property(#t92) in let final self::Number #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
+  self::expect(n1, let final self::Class #t95 = v in let final self::Number #t96 = self::ClassExtension|get#property(#t95) in let final self::Number #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
+  let final self::Class #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
+  let final self::Class #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
+  let final self::Class #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
+  let final self::Class #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
+  let final self::Class #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t103 = v in let final self::Number* #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
+  let final self::Class #t103 = v in let final self::Number #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t106 = v in let final self::Number* #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
+  let final self::Class #t106 = v in let final self::Number #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
+  let final self::Class #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
+  let final self::Class #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n1, let final self::IntClass* #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t118 = v in let final core::int* #t119 = #t118.{self::IntClass::field}{core::int*} in let final core::int* #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num*) →* core::int*} in #t119);
-  self::expect(n1, let final self::IntClass* #t121 = v in let final core::int* #t122 = #t121.{self::IntClass::field}{core::int*} in let final core::int* #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num*) →* core::int*} in #t122);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n2, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n1, let final self::IntClass #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t118 = v in let final core::int #t119 = #t118.{self::IntClass::field}{core::int} in let final core::int #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num) → core::int} in #t119);
+  self::expect(n1, let final self::IntClass #t121 = v in let final core::int #t122 = #t121.{self::IntClass::field}{core::int} in let final core::int #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num) → core::int} in #t122);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n2, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t133 = v in let final core::int* #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
-  self::expect(n2, let final self::IntClass* #t136 = v in let final core::int* #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
-  self::expect(n0, let final self::IntClass* #t139 = v in let final core::int* #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
-  self::expect(n1, let final self::IntClass* #t142 = v in let final core::int* #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
-  self::expect(n0, let final self::IntClass* #t145 = v in let final core::int* #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
-  self::expect(n1, let final self::IntClass* #t148 = v in let final core::int* #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
-  self::expect(n0, let final self::IntClass* #t151 = v in let final core::int* #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
-  self::expect(n0, let final self::IntClass* #t154 = v in let final core::int* #t155 = self::IntClassExtension|get#property(#t154) in let final core::int* #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num*) →* core::int*}) in #t155);
-  self::expect(n1, let final self::IntClass* #t157 = v in let final core::int* #t158 = self::IntClassExtension|get#property(#t157) in let final core::int* #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num*) →* core::int*}) in #t158);
+  self::expect(n1, let final self::IntClass #t133 = v in let final core::int #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num) → core::int} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
+  self::expect(n2, let final self::IntClass #t136 = v in let final core::int #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num) → core::int} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
+  self::expect(n0, let final self::IntClass #t139 = v in let final core::int #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num) → core::int} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
+  self::expect(n1, let final self::IntClass #t142 = v in let final core::int #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num) → core::int} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
+  self::expect(n0, let final self::IntClass #t145 = v in let final core::int #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num) → core::int} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
+  self::expect(n1, let final self::IntClass #t148 = v in let final core::int #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num) → core::int} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
+  self::expect(n0, let final self::IntClass #t151 = v in let final core::int #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num) → core::int} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
+  self::expect(n0, let final self::IntClass #t154 = v in let final core::int #t155 = self::IntClassExtension|get#property(#t154) in let final core::int #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num) → core::int}) in #t155);
+  self::expect(n1, let final self::IntClass #t157 = v in let final core::int #t158 = self::IntClassExtension|get#property(#t157) in let final core::int #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num) → core::int}) in #t158);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t165 = v in let final core::int* #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
+  let final self::IntClass #t165 = v in let final core::int #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num) → core::int} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t168 = v in let final core::int* #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
+  let final self::IntClass #t168 = v in let final core::int #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num) → core::int} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t173 = v in let final self::Number* #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
-  self::expect(n2, let final self::Class* #t176 = v in let final self::Number* #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
-  self::expect(n0, let final self::Class* #t179 = v in let final self::Number* #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
-  self::expect(n1, let final self::Class* #t182 = v in let final self::Number* #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
-  self::expect(n0, let final self::Class* #t185 = v in let final self::Number* #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
-  self::expect(n1, let final self::Class* #t188 = v in let final self::Number* #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
-  self::expect(n0, let final self::Class* #t191 = v in let final self::Number* #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class* #t194 = v in let final self::Number* #t195 = self::ClassExtension|get#property(#t194) in let final self::Number* #t196 = let final self::Number* #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class* #t199 = v in let final self::Number* #t200 = self::ClassExtension|get#property(#t199) in let final self::Number* #t201 = let final self::Number* #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n1, let final self::Class #t173 = v in let final self::Number #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
+  self::expect(n2, let final self::Class #t176 = v in let final self::Number #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
+  self::expect(n0, let final self::Class #t179 = v in let final self::Number #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
+  self::expect(n1, let final self::Class #t182 = v in let final self::Number #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
+  self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
+  self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
+  self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
+  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t209 = v in let final self::Number* #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t212 = v in let final self::Number* #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t217 = v in let final core::int* #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass* #t220 = v in let final core::int* #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass* #t223 = v in let final core::int* #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass* #t226 = v in let final core::int* #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass* #t229 = v in let final core::int* #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass* #t232 = v in let final core::int* #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass* #t235 = v in let final core::int* #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass* #t238 = v in let final core::int* #t239 = self::IntClassExtension|get#property(#t238) in let final core::int* #t240 = let final core::int* #t241 = #t239.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass* #t243 = v in let final core::int* #t244 = self::IntClassExtension|get#property(#t243) in let final core::int* #t245 = let final core::int* #t246 = #t244.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
+  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
+  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
+  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
+  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
+  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
+  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
+  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
+  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t253 = v in let final core::int* #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t256 = v in let final core::int* #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
-static method testExplicitNullAwareProperties(self::Class* v) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class* #t261 = v in #t261 == null ?{self::Number*} null : self::ClassExtension|get#property(#t261), v == null);
-  self::expect(n1, let final self::Class* #t262 = v in #t262 == null ?{self::Number*} null : let final self::Number* #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262), n1) in let final void #t264 = self::ClassExtension|set#property(#t262, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class* #t265 = v in #t265 == null ?{self::Number*} null : let final self::Number* #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265), n1) in let final void #t267 = self::ClassExtension|set#property(#t265, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class* #t268 = v in #t268 == null ?{self::Number*} null : let final self::Number* #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268), n2) in let final void #t270 = self::ClassExtension|set#property(#t268, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class* #t271 = v in #t271 == null ?{self::Number*} null : let final self::Number* #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271), n1) in let final void #t273 = self::ClassExtension|set#property(#t271, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class* #t274 = v in #t274 == null ?{self::Number*} null : let final self::Number* #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274), n1) in let final void #t276 = self::ClassExtension|set#property(#t274, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class* #t277 = v in #t277 == null ?{self::Number*} null : let final self::Number* #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277), 1) in let final void #t279 = self::ClassExtension|set#property(#t277, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class* #t280 = v in #t280 == null ?{self::Number*} null : let final self::Number* #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280), 1) in let final void #t282 = self::ClassExtension|set#property(#t280, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class* #t283 = v in #t283 == null ?{self::Number*} null : let final self::Number* #t284 = self::ClassExtension|get#property(#t283) in let final self::Number* #t285 = let final self::Number* #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class* #t288 = v in #t288 == null ?{self::Number*} null : let final self::Number* #t289 = self::ClassExtension|get#property(#t288) in let final self::Number* #t290 = let final self::Number* #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class* #t293 = v in #t293 == null ?{self::Number*} null : self::ClassExtension|get#property(#t293), v == null);
-  self::expect(n0, let final self::Class* #t294 = v in #t294 == null ?{self::Number*} null : self::ClassExtension|get#property(#t294), v == null);
-  let final self::Class* #t295 = v in #t295 == null ?{self::Number*} null : self::ClassExtension|set#property(#t295, self::NumberExtension|+(self::ClassExtension|get#property(#t295), n1));
-  self::expect(n1, let final self::Class* #t296 = v in #t296 == null ?{self::Number*} null : self::ClassExtension|get#property(#t296), v == null);
-  let final self::Class* #t297 = v in #t297 == null ?{self::Number*} null : self::ClassExtension|set#property(#t297, self::NumberExtension|+(self::ClassExtension|get#property(#t297), n1));
-  self::expect(n2, let final self::Class* #t298 = v in #t298 == null ?{self::Number*} null : self::ClassExtension|get#property(#t298), v == null);
-  let final self::Class* #t299 = v in #t299 == null ?{self::Number*} null : self::ClassExtension|set#property(#t299, self::NumberExtension|-(self::ClassExtension|get#property(#t299), n2));
-  self::expect(n0, let final self::Class* #t300 = v in #t300 == null ?{self::Number*} null : self::ClassExtension|get#property(#t300), v == null);
-  let final self::Class* #t301 = v in #t301 == null ?{self::Number*} null : self::ClassExtension|set#property(#t301, self::NumberExtension|+(self::ClassExtension|get#property(#t301), n1));
-  self::expect(n1, let final self::Class* #t302 = v in #t302 == null ?{self::Number*} null : self::ClassExtension|get#property(#t302), v == null);
-  let final self::Class* #t303 = v in #t303 == null ?{self::Number*} null : self::ClassExtension|set#property(#t303, self::NumberExtension|-(self::ClassExtension|get#property(#t303), n1));
-  self::expect(n0, let final self::Class* #t304 = v in #t304 == null ?{self::Number*} null : self::ClassExtension|get#property(#t304), v == null);
-  let final self::Class* #t305 = v in #t305 == null ?{self::Number*} null : let final self::Number* #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305), 1) in let final void #t307 = self::ClassExtension|set#property(#t305, #t306) in #t306;
-  self::expect(n1, let final self::Class* #t308 = v in #t308 == null ?{self::Number*} null : self::ClassExtension|get#property(#t308), v == null);
-  let final self::Class* #t309 = v in #t309 == null ?{self::Number*} null : let final self::Number* #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309), 1) in let final void #t311 = self::ClassExtension|set#property(#t309, #t310) in #t310;
-  self::expect(n0, let final self::Class* #t312 = v in #t312 == null ?{self::Number*} null : self::ClassExtension|get#property(#t312), v == null);
-  let final self::Class* #t313 = v in #t313 == null ?{self::Number*} null : self::ClassExtension|set#property(#t313, self::NumberExtension|+(self::ClassExtension|get#property(#t313), 1));
-  self::expect(n1, let final self::Class* #t314 = v in #t314 == null ?{self::Number*} null : self::ClassExtension|get#property(#t314), v == null);
-  let final self::Class* #t315 = v in #t315 == null ?{self::Number*} null : self::ClassExtension|set#property(#t315, self::NumberExtension|-(self::ClassExtension|get#property(#t315), 1));
-  self::expect(n0, let final self::Class* #t316 = v in #t316 == null ?{self::Number*} null : self::ClassExtension|get#property(#t316), v == null);
+static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
+  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
+  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
+  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
+  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
+  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
+  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
+  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
+  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
+  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
+  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
+  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
+  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
+  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
+  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
+  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
+  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
+  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
+  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
+  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
-static method testExplicitNullAwareIntProperties(self::IntClass* v) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::expect(n0, let final self::IntClass* #t317 = v in #t317 == null ?{core::int*} null : self::IntClassExtension|get#property(#t317), v == null);
-  self::expect(n1, let final self::IntClass* #t318 = v in #t318 == null ?{core::int*} null : let final core::int* #t319 = self::IntClassExtension|get#property(#t318).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t320 = self::IntClassExtension|set#property(#t318, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass* #t321 = v in #t321 == null ?{core::int*} null : let final core::int* #t322 = self::IntClassExtension|get#property(#t321).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t323 = self::IntClassExtension|set#property(#t321, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass* #t324 = v in #t324 == null ?{core::int*} null : let final core::int* #t325 = self::IntClassExtension|get#property(#t324).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t326 = self::IntClassExtension|set#property(#t324, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass* #t327 = v in #t327 == null ?{core::int*} null : let final core::int* #t328 = self::IntClassExtension|get#property(#t327).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t329 = self::IntClassExtension|set#property(#t327, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass* #t330 = v in #t330 == null ?{core::int*} null : let final core::int* #t331 = self::IntClassExtension|get#property(#t330).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t332 = self::IntClassExtension|set#property(#t330, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass* #t333 = v in #t333 == null ?{core::int*} null : let final core::int* #t334 = self::IntClassExtension|get#property(#t333).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t335 = self::IntClassExtension|set#property(#t333, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass* #t336 = v in #t336 == null ?{core::int*} null : let final core::int* #t337 = self::IntClassExtension|get#property(#t336).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t338 = self::IntClassExtension|set#property(#t336, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass* #t339 = v in #t339 == null ?{core::int*} null : let final core::int* #t340 = self::IntClassExtension|get#property(#t339) in let final core::int* #t341 = let final core::int* #t342 = #t340.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t343 = self::IntClassExtension|set#property(#t339, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass* #t344 = v in #t344 == null ?{core::int*} null : let final core::int* #t345 = self::IntClassExtension|get#property(#t344) in let final core::int* #t346 = let final core::int* #t347 = #t345.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t348 = self::IntClassExtension|set#property(#t344, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass* #t349 = v in #t349 == null ?{core::int*} null : self::IntClassExtension|get#property(#t349), v == null);
-  self::expect(n0, let final self::IntClass* #t350 = v in #t350 == null ?{core::int*} null : self::IntClassExtension|get#property(#t350), v == null);
-  let final self::IntClass* #t351 = v in #t351 == null ?{core::int*} null : self::IntClassExtension|set#property(#t351, self::IntClassExtension|get#property(#t351).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t352 = v in #t352 == null ?{core::int*} null : self::IntClassExtension|get#property(#t352), v == null);
-  let final self::IntClass* #t353 = v in #t353 == null ?{core::int*} null : self::IntClassExtension|set#property(#t353, self::IntClassExtension|get#property(#t353).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t354 = v in #t354 == null ?{core::int*} null : self::IntClassExtension|get#property(#t354), v == null);
-  let final self::IntClass* #t355 = v in #t355 == null ?{core::int*} null : self::IntClassExtension|set#property(#t355, self::IntClassExtension|get#property(#t355).{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t356 = v in #t356 == null ?{core::int*} null : self::IntClassExtension|get#property(#t356), v == null);
-  let final self::IntClass* #t357 = v in #t357 == null ?{core::int*} null : self::IntClassExtension|set#property(#t357, self::IntClassExtension|get#property(#t357).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t358 = v in #t358 == null ?{core::int*} null : self::IntClassExtension|get#property(#t358), v == null);
-  let final self::IntClass* #t359 = v in #t359 == null ?{core::int*} null : self::IntClassExtension|set#property(#t359, self::IntClassExtension|get#property(#t359).{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t360 = v in #t360 == null ?{core::int*} null : self::IntClassExtension|get#property(#t360), v == null);
-  let final self::IntClass* #t361 = v in #t361 == null ?{core::int*} null : let final core::int* #t362 = self::IntClassExtension|get#property(#t361).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t363 = self::IntClassExtension|set#property(#t361, #t362) in #t362;
-  self::expect(n1, let final self::IntClass* #t364 = v in #t364 == null ?{core::int*} null : self::IntClassExtension|get#property(#t364), v == null);
-  let final self::IntClass* #t365 = v in #t365 == null ?{core::int*} null : let final core::int* #t366 = self::IntClassExtension|get#property(#t365).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t367 = self::IntClassExtension|set#property(#t365, #t366) in #t366;
-  self::expect(n0, let final self::IntClass* #t368 = v in #t368 == null ?{core::int*} null : self::IntClassExtension|get#property(#t368), v == null);
-  let final self::IntClass* #t369 = v in #t369 == null ?{core::int*} null : self::IntClassExtension|set#property(#t369, self::IntClassExtension|get#property(#t369).{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t370 = v in #t370 == null ?{core::int*} null : self::IntClassExtension|get#property(#t370), v == null);
-  let final self::IntClass* #t371 = v in #t371 == null ?{core::int*} null : self::IntClassExtension|set#property(#t371, self::IntClassExtension|get#property(#t371).{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t372 = v in #t372 == null ?{core::int*} null : self::IntClassExtension|get#property(#t372), v == null);
+static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
+  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
+  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
+  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
+  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
+  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
+  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
+  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
+  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
+  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
+  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
+  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
+  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
+  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
+  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
+  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
-  if(expectNull as{TypeError,ForDynamic} core::bool*) {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
     expected = null;
   }
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/compounds.dart.weak.outline.expect
index dfddc05..aafd3ce 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.weak.outline.expect
@@ -1,90 +1,63 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Number extends core::Object {
-  final field core::int* value;
-  constructor •(core::int* value) → self::Number*
+  final field core::int value;
+  constructor •(core::int value) → self::Number
     ;
-  get hashCode() → core::int*
+  get hashCode() → core::int
     ;
-  operator ==(core::Object* other) → core::bool*
+  operator ==(core::Object other) → core::bool
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class extends core::Object {
-  field self::Number* field;
-  constructor •(self::Number* field) → self::Class*
+  field self::Number field;
+  constructor •(self::Number field) → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class IntClass extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::IntClass*
+  field core::int field;
+  constructor •(core::int field) → self::IntClass
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension NumberExtension on self::Number* {
+extension NumberExtension on self::Number {
   operator + = self::NumberExtension|+;
   operator - = self::NumberExtension|-;
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   get property = self::ClassExtension|get#property;
   method testImplicitProperties = self::ClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
   set property = self::ClassExtension|set#property;
 }
-extension IntClassExtension on self::IntClass* {
+extension IntClassExtension on self::IntClass {
   get property = self::IntClassExtension|get#property;
   method testImplicitProperties = self::IntClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::IntClassExtension|get#testImplicitProperties;
   set property = self::IntClassExtension|set#property;
 }
-static method NumberExtension|+(lowered final self::Number* #this, core::Object* other) → self::Number*
+static method NumberExtension|+(lowered final self::Number #this, core::Object other) → self::Number
   ;
-static method NumberExtension|-(lowered final self::Number* #this, core::Object* other) → self::Number*
+static method NumberExtension|-(lowered final self::Number #this, core::Object other) → self::Number
   ;
-static method ClassExtension|get#property(lowered final self::Class* #this) → self::Number*
+static method ClassExtension|get#property(lowered final self::Class #this) → self::Number
   ;
-static method ClassExtension|set#property(lowered final self::Class* #this, self::Number* value) → void
+static method ClassExtension|set#property(lowered final self::Class #this, self::Number value) → void
   ;
-static method ClassExtension|testImplicitProperties(lowered final self::Class* #this) → dynamic
+static method ClassExtension|testImplicitProperties(lowered final self::Class #this) → dynamic
   ;
-static method ClassExtension|get#testImplicitProperties(lowered final self::Class* #this) → () →* dynamic
+static method ClassExtension|get#testImplicitProperties(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
-static method IntClassExtension|get#property(lowered final self::IntClass* #this) → core::int*
+static method IntClassExtension|get#property(lowered final self::IntClass #this) → core::int
   ;
-static method IntClassExtension|set#property(lowered final self::IntClass* #this, core::int* value) → void
+static method IntClassExtension|set#property(lowered final self::IntClass #this, core::int value) → void
   ;
-static method IntClassExtension|testImplicitProperties(lowered final self::IntClass* #this) → dynamic
+static method IntClassExtension|testImplicitProperties(lowered final self::IntClass #this) → dynamic
   ;
-static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass* #this) → () →* dynamic
+static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass #this) → () → dynamic
   return () → dynamic => self::IntClassExtension|testImplicitProperties(#this);
 static method main() → dynamic
   ;
@@ -98,9 +71,9 @@
   ;
 static method testExplicitIntProperties() → dynamic
   ;
-static method testExplicitNullAwareProperties(self::Class* v) → dynamic
+static method testExplicitNullAwareProperties(self::Class? v) → dynamic
   ;
-static method testExplicitNullAwareIntProperties(self::IntClass* v) → dynamic
+static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic
   ;
 static method expect(dynamic expected, dynamic actual, [has-declared-initializer dynamic expectNull]) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/compounds.dart.weak.transformed.expect
index ccd5bd4..d1424bc 100644
--- a/pkg/front_end/testcases/extensions/compounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/compounds.dart.weak.transformed.expect
@@ -1,117 +1,90 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Number extends core::Object {
-  final field core::int* value;
-  constructor •(core::int* value) → self::Number*
+  final field core::int value;
+  constructor •(core::int value) → self::Number
     : self::Number::value = value, super core::Object::•()
     ;
-  get hashCode() → core::int*
-    return this.{self::Number::value}{core::int*}.{core::num::hashCode}{core::int*};
-  operator ==(core::Object* other) → core::bool*
-    return other is self::Number* && this.{self::Number::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Number*}.{self::Number::value}{core::int*};
-  method toString() → core::String*
-    return "Number(${this.{self::Number::value}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  get hashCode() → core::int
+    return this.{self::Number::value}{core::int}.{core::num::hashCode}{core::int};
+  operator ==(core::Object other) → core::bool
+    return other is{ForNonNullableByDefault} self::Number && this.{self::Number::value}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Number}.{self::Number::value}{core::int};
+  method toString() → core::String
+    return "Number(${this.{self::Number::value}{core::int}})";
 }
 class Class extends core::Object {
-  field self::Number* field;
-  constructor •(self::Number* field) → self::Class*
+  field self::Number field;
+  constructor •(self::Number field) → self::Class
     : self::Class::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class IntClass extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::IntClass*
+  field core::int field;
+  constructor •(core::int field) → self::IntClass
     : self::IntClass::field = field, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension NumberExtension on self::Number* {
+extension NumberExtension on self::Number {
   operator + = self::NumberExtension|+;
   operator - = self::NumberExtension|-;
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   get property = self::ClassExtension|get#property;
   method testImplicitProperties = self::ClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
   set property = self::ClassExtension|set#property;
 }
-extension IntClassExtension on self::IntClass* {
+extension IntClassExtension on self::IntClass {
   get property = self::IntClassExtension|get#property;
   method testImplicitProperties = self::IntClassExtension|testImplicitProperties;
   tearoff testImplicitProperties = self::IntClassExtension|get#testImplicitProperties;
   set property = self::IntClassExtension|set#property;
 }
-static method NumberExtension|+(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|+(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::+}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method NumberExtension|-(lowered final self::Number* #this, core::Object* other) → self::Number* {
-  if(other is core::int*) {
-    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{core::int*}){(core::num*) →* core::int*});
+static method NumberExtension|-(lowered final self::Number #this, core::Object other) → self::Number {
+  if(other is{ForNonNullableByDefault} core::int) {
+    return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{core::int}){(core::num) → core::int});
   }
   else
-    if(other is self::Number*) {
-      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    if(other is{ForNonNullableByDefault} self::Number) {
+      return new self::Number::•(#this.{self::Number::value}{core::int}.{core::num::-}(other{self::Number}.{self::Number::value}{core::int}){(core::num) → core::int});
     }
     else {
       throw new core::ArgumentError::•("${other}");
     }
 }
-static method ClassExtension|get#property(lowered final self::Class* #this) → self::Number*
-  return #this.{self::Class::field}{self::Number*};
-static method ClassExtension|set#property(lowered final self::Class* #this, self::Number* value) → void {
+static method ClassExtension|get#property(lowered final self::Class #this) → self::Number
+  return #this.{self::Class::field}{self::Number};
+static method ClassExtension|set#property(lowered final self::Class #this, self::Number value) → void {
   #this.{self::Class::field} = value;
 }
-static method ClassExtension|testImplicitProperties(lowered final self::Class* #this) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
+static method ClassExtension|testImplicitProperties(lowered final self::Class #this) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
   self::expect(n0, self::ClassExtension|get#property(#this));
-  self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
-  self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
-  self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
-  self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
-  self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
-  self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
-  self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
-  self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final self::Number* #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
-  self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final self::Number* #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n1, let final self::Number #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
+  self::expect(n2, let final self::Number #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
+  self::expect(n0, let final self::Number #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
+  self::expect(n1, let final self::Number #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
+  self::expect(n0, let final self::Number #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
+  self::expect(n1, let final self::Number #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
+  self::expect(n0, let final self::Number #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
+  self::expect(n0, let final self::Number #t15 = self::ClassExtension|get#property(#this) in let final self::Number #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number #t17 = self::ClassExtension|get#property(#this) in let final self::Number #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@@ -124,58 +97,58 @@
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
   self::expect(n0, self::ClassExtension|get#property(#this));
-  let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
+  let final self::Number #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
   self::expect(n1, self::ClassExtension|get#property(#this));
-  let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
+  let final self::Number #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
   self::expect(n0, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
   self::expect(n1, self::ClassExtension|get#property(#this));
   self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
   self::expect(n0, self::ClassExtension|get#property(#this));
 }
-static method ClassExtension|get#testImplicitProperties(lowered final self::Class* #this) → () →* dynamic
+static method ClassExtension|get#testImplicitProperties(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
-static method IntClassExtension|get#property(lowered final self::IntClass* #this) → core::int*
-  return #this.{self::IntClass::field}{core::int*};
-static method IntClassExtension|set#property(lowered final self::IntClass* #this, core::int* value) → void {
+static method IntClassExtension|get#property(lowered final self::IntClass #this) → core::int
+  return #this.{self::IntClass::field}{core::int};
+static method IntClassExtension|set#property(lowered final self::IntClass #this, core::int value) → void {
   #this.{self::IntClass::field} = value;
 }
-static method IntClassExtension|testImplicitProperties(lowered final self::IntClass* #this) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
+static method IntClassExtension|testImplicitProperties(lowered final self::IntClass #this) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::expect(n1, let final core::int* #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
-  self::expect(n2, let final core::int* #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
-  self::expect(n0, let final core::int* #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
-  self::expect(n1, let final core::int* #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
-  self::expect(n0, let final core::int* #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
-  self::expect(n1, let final core::int* #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
-  self::expect(n0, let final core::int* #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
-  self::expect(n0, let final core::int* #t37 = self::IntClassExtension|get#property(#this) in let final core::int* #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num*) →* core::int*}) in #t37);
-  self::expect(n1, let final core::int* #t39 = self::IntClassExtension|get#property(#this) in let final core::int* #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num*) →* core::int*}) in #t39);
+  self::expect(n1, let final core::int #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
+  self::expect(n2, let final core::int #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
+  self::expect(n0, let final core::int #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
+  self::expect(n1, let final core::int #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
+  self::expect(n0, let final core::int #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
+  self::expect(n1, let final core::int #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
+  self::expect(n0, let final core::int #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
+  self::expect(n0, let final core::int #t37 = self::IntClassExtension|get#property(#this) in let final core::int #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num) → core::int}) in #t37);
+  self::expect(n1, let final core::int #t39 = self::IntClassExtension|get#property(#this) in let final core::int #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num) → core::int}) in #t39);
   self::expect(n0, self::IntClassExtension|get#property(#this));
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  let final core::int* #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
+  let final core::int #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  let final core::int* #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
+  let final core::int #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
   self::expect(n0, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(#this));
-  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*});
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(#this));
 }
-static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass* #this) → () →* dynamic
+static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass #this) → () → dynamic
   return () → dynamic => self::IntClassExtension|testImplicitProperties(#this);
 static method main() → dynamic {
   self::testLocals();
@@ -191,10 +164,10 @@
   self::IntClassExtension|testImplicitProperties(new self::IntClass::•(0));
 }
 static method testLocals() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Number* v = n0;
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Number v = n0;
   self::expect(n0, v);
   self::expect(n1, v = self::NumberExtension|+(v, n1));
   self::expect(n2, v = self::NumberExtension|+(v, n1));
@@ -203,8 +176,8 @@
   self::expect(n0, v = self::NumberExtension|-(v, n1));
   self::expect(n1, v = self::NumberExtension|+(v, 1));
   self::expect(n0, v = self::NumberExtension|-(v, 1));
-  self::expect(n0, let final self::Number* #t45 = v in let final self::Number* #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
-  self::expect(n1, let final self::Number* #t47 = v in let final self::Number* #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
+  self::expect(n0, let final self::Number #t45 = v in let final self::Number #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
+  self::expect(n1, let final self::Number #t47 = v in let final self::Number #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
   self::expect(n0, v);
   self::expect(n0, v);
   v = self::NumberExtension|+(v, n1);
@@ -227,284 +200,284 @@
   self::expect(n0, v);
 }
 static method testProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n1, let final self::Class* #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number*}, n1));
-  self::expect(n2, let final self::Class* #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number*}, n2));
-  self::expect(n1, let final self::Class* #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number*}, n1));
-  self::expect(n0, let final self::Class* #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number*}, n1));
-  self::expect(n1, let final self::Class* #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number*}, 1));
-  self::expect(n0, let final self::Class* #t56 = v in let final self::Number* #t57 = #t56.{self::Class::field}{self::Number*} in let final self::Number* #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
-  self::expect(n1, let final self::Class* #t59 = v in let final self::Number* #t60 = #t59.{self::Class::field}{self::Number*} in let final self::Number* #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number*}, n1);
-  self::expect(n2, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number*}, n2);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number*}, n1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number*}, n1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number*}, 1);
-  self::expect(n1, v.{self::Class::field}{self::Number*});
-  let final self::Class* #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number*}, 1);
-  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n1, let final self::Class #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number}, n1));
+  self::expect(n2, let final self::Class #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number}, n2));
+  self::expect(n1, let final self::Class #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number}, n1));
+  self::expect(n0, let final self::Class #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number}, n1));
+  self::expect(n1, let final self::Class #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number}, 1));
+  self::expect(n0, let final self::Class #t56 = v in let final self::Number #t57 = #t56.{self::Class::field}{self::Number} in let final self::Number #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
+  self::expect(n1, let final self::Class #t59 = v in let final self::Number #t60 = #t59.{self::Class::field}{self::Number} in let final self::Number #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number}, n1);
+  self::expect(n2, v.{self::Class::field}{self::Number});
+  let final self::Class #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number}, n2);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number}, n1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
+  let final self::Class #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number});
+  let final self::Class #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number});
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t71 = v in let final self::Number* #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
-  self::expect(n2, let final self::Class* #t74 = v in let final self::Number* #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
-  self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
-  self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
-  self::expect(n0, let final self::Class* #t83 = v in let final self::Number* #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
-  self::expect(n1, let final self::Class* #t86 = v in let final self::Number* #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
-  self::expect(n0, let final self::Class* #t89 = v in let final self::Number* #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
-  self::expect(n0, let final self::Class* #t92 = v in let final self::Number* #t93 = self::ClassExtension|get#property(#t92) in let final self::Number* #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
-  self::expect(n1, let final self::Class* #t95 = v in let final self::Number* #t96 = self::ClassExtension|get#property(#t95) in let final self::Number* #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
+  self::expect(n1, let final self::Class #t71 = v in let final self::Number #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
+  self::expect(n2, let final self::Class #t74 = v in let final self::Number #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
+  self::expect(n0, let final self::Class #t77 = v in let final self::Number #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
+  self::expect(n1, let final self::Class #t80 = v in let final self::Number #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
+  self::expect(n0, let final self::Class #t83 = v in let final self::Number #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
+  self::expect(n1, let final self::Class #t86 = v in let final self::Number #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
+  self::expect(n0, let final self::Class #t89 = v in let final self::Number #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
+  self::expect(n0, let final self::Class #t92 = v in let final self::Number #t93 = self::ClassExtension|get#property(#t92) in let final self::Number #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
+  self::expect(n1, let final self::Class #t95 = v in let final self::Number #t96 = self::ClassExtension|get#property(#t95) in let final self::Number #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
+  let final self::Class #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
+  let final self::Class #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
+  let final self::Class #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
+  let final self::Class #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
+  let final self::Class #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t103 = v in let final self::Number* #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
+  let final self::Class #t103 = v in let final self::Number #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t106 = v in let final self::Number* #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
+  let final self::Class #t106 = v in let final self::Number #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
+  let final self::Class #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
+  let final self::Class #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n1, let final self::IntClass* #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t118 = v in let final core::int* #t119 = #t118.{self::IntClass::field}{core::int*} in let final core::int* #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num*) →* core::int*} in #t119);
-  self::expect(n1, let final self::IntClass* #t121 = v in let final core::int* #t122 = #t121.{self::IntClass::field}{core::int*} in let final core::int* #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num*) →* core::int*} in #t122);
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n2, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
-  self::expect(n1, v.{self::IntClass::field}{core::int*});
-  let final self::IntClass* #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
-  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n1, let final self::IntClass #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass #t118 = v in let final core::int #t119 = #t118.{self::IntClass::field}{core::int} in let final core::int #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num) → core::int} in #t119);
+  self::expect(n1, let final self::IntClass #t121 = v in let final core::int #t122 = #t121.{self::IntClass::field}{core::int} in let final core::int #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num) → core::int} in #t122);
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n2, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int}.{core::num::-}(n2){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int}.{core::num::+}(n1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int}.{core::num::-}(n1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::expect(n1, v.{self::IntClass::field}{core::int});
+  let final self::IntClass #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int}.{core::num::-}(1){(core::num) → core::int};
+  self::expect(n0, v.{self::IntClass::field}{core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t133 = v in let final core::int* #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
-  self::expect(n2, let final self::IntClass* #t136 = v in let final core::int* #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
-  self::expect(n0, let final self::IntClass* #t139 = v in let final core::int* #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
-  self::expect(n1, let final self::IntClass* #t142 = v in let final core::int* #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
-  self::expect(n0, let final self::IntClass* #t145 = v in let final core::int* #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
-  self::expect(n1, let final self::IntClass* #t148 = v in let final core::int* #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
-  self::expect(n0, let final self::IntClass* #t151 = v in let final core::int* #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
-  self::expect(n0, let final self::IntClass* #t154 = v in let final core::int* #t155 = self::IntClassExtension|get#property(#t154) in let final core::int* #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num*) →* core::int*}) in #t155);
-  self::expect(n1, let final self::IntClass* #t157 = v in let final core::int* #t158 = self::IntClassExtension|get#property(#t157) in let final core::int* #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num*) →* core::int*}) in #t158);
+  self::expect(n1, let final self::IntClass #t133 = v in let final core::int #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num) → core::int} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
+  self::expect(n2, let final self::IntClass #t136 = v in let final core::int #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num) → core::int} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
+  self::expect(n0, let final self::IntClass #t139 = v in let final core::int #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num) → core::int} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
+  self::expect(n1, let final self::IntClass #t142 = v in let final core::int #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num) → core::int} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
+  self::expect(n0, let final self::IntClass #t145 = v in let final core::int #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num) → core::int} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
+  self::expect(n1, let final self::IntClass #t148 = v in let final core::int #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num) → core::int} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
+  self::expect(n0, let final self::IntClass #t151 = v in let final core::int #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num) → core::int} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
+  self::expect(n0, let final self::IntClass #t154 = v in let final core::int #t155 = self::IntClassExtension|get#property(#t154) in let final core::int #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num) → core::int}) in #t155);
+  self::expect(n1, let final self::IntClass #t157 = v in let final core::int #t158 = self::IntClassExtension|get#property(#t157) in let final core::int #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num) → core::int}) in #t158);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t165 = v in let final core::int* #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
+  let final self::IntClass #t165 = v in let final core::int #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num) → core::int} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t168 = v in let final core::int* #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
+  let final self::IntClass #t168 = v in let final core::int #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num) → core::int} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
 static method testExplicitProperties() → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::Class* v = new self::Class::•(n0);
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::Class v = new self::Class::•(n0);
   self::expect(n0, self::ClassExtension|get#property(v));
-  self::expect(n1, let final self::Class* #t173 = v in let final self::Number* #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
-  self::expect(n2, let final self::Class* #t176 = v in let final self::Number* #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
-  self::expect(n0, let final self::Class* #t179 = v in let final self::Number* #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
-  self::expect(n1, let final self::Class* #t182 = v in let final self::Number* #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
-  self::expect(n0, let final self::Class* #t185 = v in let final self::Number* #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
-  self::expect(n1, let final self::Class* #t188 = v in let final self::Number* #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
-  self::expect(n0, let final self::Class* #t191 = v in let final self::Number* #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
-  self::expect(n0, let final self::Class* #t194 = v in let final self::Number* #t195 = self::ClassExtension|get#property(#t194) in let final self::Number* #t196 = let final self::Number* #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
-  self::expect(n1, let final self::Class* #t199 = v in let final self::Number* #t200 = self::ClassExtension|get#property(#t199) in let final self::Number* #t201 = let final self::Number* #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n1, let final self::Class #t173 = v in let final self::Number #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
+  self::expect(n2, let final self::Class #t176 = v in let final self::Number #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
+  self::expect(n0, let final self::Class #t179 = v in let final self::Number #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
+  self::expect(n1, let final self::Class #t182 = v in let final self::Number #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
+  self::expect(n0, let final self::Class #t185 = v in let final self::Number #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
+  self::expect(n1, let final self::Class #t188 = v in let final self::Number #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
+  self::expect(n0, let final self::Class #t191 = v in let final self::Number #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
+  self::expect(n0, let final self::Class #t194 = v in let final self::Number #t195 = self::ClassExtension|get#property(#t194) in let final self::Number #t196 = let final self::Number #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
+  self::expect(n1, let final self::Class #t199 = v in let final self::Number #t200 = self::ClassExtension|get#property(#t199) in let final self::Number #t201 = let final self::Number #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
   self::expect(n0, self::ClassExtension|get#property(v));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  let final self::Class #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  let final self::Class #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
   self::expect(n2, self::ClassExtension|get#property(v));
-  let final self::Class* #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  let final self::Class #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  let final self::Class #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  let final self::Class #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t209 = v in let final self::Number* #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  let final self::Class #t209 = v in let final self::Number #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t212 = v in let final self::Number* #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  let final self::Class #t212 = v in let final self::Number #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
   self::expect(n0, self::ClassExtension|get#property(v));
-  let final self::Class* #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  let final self::Class #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
   self::expect(n1, self::ClassExtension|get#property(v));
-  let final self::Class* #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  let final self::Class #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
   self::expect(n0, self::ClassExtension|get#property(v));
 }
 static method testExplicitIntProperties() → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::IntClass* v = new self::IntClass::•(n0);
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::IntClass v = new self::IntClass::•(n0);
   self::expect(n0, self::IntClassExtension|get#property(v));
-  self::expect(n1, let final self::IntClass* #t217 = v in let final core::int* #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
-  self::expect(n2, let final self::IntClass* #t220 = v in let final core::int* #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
-  self::expect(n0, let final self::IntClass* #t223 = v in let final core::int* #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
-  self::expect(n1, let final self::IntClass* #t226 = v in let final core::int* #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
-  self::expect(n0, let final self::IntClass* #t229 = v in let final core::int* #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
-  self::expect(n1, let final self::IntClass* #t232 = v in let final core::int* #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
-  self::expect(n0, let final self::IntClass* #t235 = v in let final core::int* #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
-  self::expect(n0, let final self::IntClass* #t238 = v in let final core::int* #t239 = self::IntClassExtension|get#property(#t238) in let final core::int* #t240 = let final core::int* #t241 = #t239.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
-  self::expect(n1, let final self::IntClass* #t243 = v in let final core::int* #t244 = self::IntClassExtension|get#property(#t243) in let final core::int* #t245 = let final core::int* #t246 = #t244.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n1, let final self::IntClass #t217 = v in let final core::int #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num) → core::int} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
+  self::expect(n2, let final self::IntClass #t220 = v in let final core::int #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num) → core::int} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
+  self::expect(n0, let final self::IntClass #t223 = v in let final core::int #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num) → core::int} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
+  self::expect(n1, let final self::IntClass #t226 = v in let final core::int #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num) → core::int} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
+  self::expect(n0, let final self::IntClass #t229 = v in let final core::int #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num) → core::int} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
+  self::expect(n1, let final self::IntClass #t232 = v in let final core::int #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num) → core::int} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
+  self::expect(n0, let final self::IntClass #t235 = v in let final core::int #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num) → core::int} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
+  self::expect(n0, let final self::IntClass #t238 = v in let final core::int #t239 = self::IntClassExtension|get#property(#t238) in let final core::int #t240 = let final core::int #t241 = #t239.{core::num::+}(1){(core::num) → core::int} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
+  self::expect(n1, let final self::IntClass #t243 = v in let final core::int #t244 = self::IntClassExtension|get#property(#t243) in let final core::int #t245 = let final core::int #t246 = #t244.{core::num::-}(1){(core::num) → core::int} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
   self::expect(n0, self::IntClassExtension|get#property(v));
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n2, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num*) →* core::int*});
+  let final self::IntClass #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num*) →* core::int*});
+  let final self::IntClass #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t253 = v in let final core::int* #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  let final self::IntClass #t253 = v in let final core::int #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num) → core::int} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t256 = v in let final core::int* #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  let final self::IntClass #t256 = v in let final core::int #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num) → core::int} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
   self::expect(n0, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num) → core::int});
   self::expect(n1, self::IntClassExtension|get#property(v));
-  let final self::IntClass* #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num*) →* core::int*});
+  let final self::IntClass #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num) → core::int});
   self::expect(n0, self::IntClassExtension|get#property(v));
 }
-static method testExplicitNullAwareProperties(self::Class* v) → dynamic {
-  self::Number* n0 = new self::Number::•(0);
-  self::Number* n1 = new self::Number::•(1);
-  self::Number* n2 = new self::Number::•(2);
-  self::expect(n0, let final self::Class* #t261 = v in #t261 == null ?{self::Number*} null : self::ClassExtension|get#property(#t261), v == null);
-  self::expect(n1, let final self::Class* #t262 = v in #t262 == null ?{self::Number*} null : let final self::Number* #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262), n1) in let final void #t264 = self::ClassExtension|set#property(#t262, #t263) in #t263, v == null);
-  self::expect(n2, let final self::Class* #t265 = v in #t265 == null ?{self::Number*} null : let final self::Number* #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265), n1) in let final void #t267 = self::ClassExtension|set#property(#t265, #t266) in #t266, v == null);
-  self::expect(n0, let final self::Class* #t268 = v in #t268 == null ?{self::Number*} null : let final self::Number* #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268), n2) in let final void #t270 = self::ClassExtension|set#property(#t268, #t269) in #t269, v == null);
-  self::expect(n1, let final self::Class* #t271 = v in #t271 == null ?{self::Number*} null : let final self::Number* #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271), n1) in let final void #t273 = self::ClassExtension|set#property(#t271, #t272) in #t272, v == null);
-  self::expect(n0, let final self::Class* #t274 = v in #t274 == null ?{self::Number*} null : let final self::Number* #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274), n1) in let final void #t276 = self::ClassExtension|set#property(#t274, #t275) in #t275, v == null);
-  self::expect(n1, let final self::Class* #t277 = v in #t277 == null ?{self::Number*} null : let final self::Number* #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277), 1) in let final void #t279 = self::ClassExtension|set#property(#t277, #t278) in #t278, v == null);
-  self::expect(n0, let final self::Class* #t280 = v in #t280 == null ?{self::Number*} null : let final self::Number* #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280), 1) in let final void #t282 = self::ClassExtension|set#property(#t280, #t281) in #t281, v == null);
-  self::expect(n0, let final self::Class* #t283 = v in #t283 == null ?{self::Number*} null : let final self::Number* #t284 = self::ClassExtension|get#property(#t283) in let final self::Number* #t285 = let final self::Number* #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283, #t286) in #t286 in #t284, v == null);
-  self::expect(n1, let final self::Class* #t288 = v in #t288 == null ?{self::Number*} null : let final self::Number* #t289 = self::ClassExtension|get#property(#t288) in let final self::Number* #t290 = let final self::Number* #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288, #t291) in #t291 in #t289, v == null);
-  self::expect(n0, let final self::Class* #t293 = v in #t293 == null ?{self::Number*} null : self::ClassExtension|get#property(#t293), v == null);
-  self::expect(n0, let final self::Class* #t294 = v in #t294 == null ?{self::Number*} null : self::ClassExtension|get#property(#t294), v == null);
-  let final self::Class* #t295 = v in #t295 == null ?{self::Number*} null : self::ClassExtension|set#property(#t295, self::NumberExtension|+(self::ClassExtension|get#property(#t295), n1));
-  self::expect(n1, let final self::Class* #t296 = v in #t296 == null ?{self::Number*} null : self::ClassExtension|get#property(#t296), v == null);
-  let final self::Class* #t297 = v in #t297 == null ?{self::Number*} null : self::ClassExtension|set#property(#t297, self::NumberExtension|+(self::ClassExtension|get#property(#t297), n1));
-  self::expect(n2, let final self::Class* #t298 = v in #t298 == null ?{self::Number*} null : self::ClassExtension|get#property(#t298), v == null);
-  let final self::Class* #t299 = v in #t299 == null ?{self::Number*} null : self::ClassExtension|set#property(#t299, self::NumberExtension|-(self::ClassExtension|get#property(#t299), n2));
-  self::expect(n0, let final self::Class* #t300 = v in #t300 == null ?{self::Number*} null : self::ClassExtension|get#property(#t300), v == null);
-  let final self::Class* #t301 = v in #t301 == null ?{self::Number*} null : self::ClassExtension|set#property(#t301, self::NumberExtension|+(self::ClassExtension|get#property(#t301), n1));
-  self::expect(n1, let final self::Class* #t302 = v in #t302 == null ?{self::Number*} null : self::ClassExtension|get#property(#t302), v == null);
-  let final self::Class* #t303 = v in #t303 == null ?{self::Number*} null : self::ClassExtension|set#property(#t303, self::NumberExtension|-(self::ClassExtension|get#property(#t303), n1));
-  self::expect(n0, let final self::Class* #t304 = v in #t304 == null ?{self::Number*} null : self::ClassExtension|get#property(#t304), v == null);
-  let final self::Class* #t305 = v in #t305 == null ?{self::Number*} null : let final self::Number* #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305), 1) in let final void #t307 = self::ClassExtension|set#property(#t305, #t306) in #t306;
-  self::expect(n1, let final self::Class* #t308 = v in #t308 == null ?{self::Number*} null : self::ClassExtension|get#property(#t308), v == null);
-  let final self::Class* #t309 = v in #t309 == null ?{self::Number*} null : let final self::Number* #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309), 1) in let final void #t311 = self::ClassExtension|set#property(#t309, #t310) in #t310;
-  self::expect(n0, let final self::Class* #t312 = v in #t312 == null ?{self::Number*} null : self::ClassExtension|get#property(#t312), v == null);
-  let final self::Class* #t313 = v in #t313 == null ?{self::Number*} null : self::ClassExtension|set#property(#t313, self::NumberExtension|+(self::ClassExtension|get#property(#t313), 1));
-  self::expect(n1, let final self::Class* #t314 = v in #t314 == null ?{self::Number*} null : self::ClassExtension|get#property(#t314), v == null);
-  let final self::Class* #t315 = v in #t315 == null ?{self::Number*} null : self::ClassExtension|set#property(#t315, self::NumberExtension|-(self::ClassExtension|get#property(#t315), 1));
-  self::expect(n0, let final self::Class* #t316 = v in #t316 == null ?{self::Number*} null : self::ClassExtension|get#property(#t316), v == null);
+static method testExplicitNullAwareProperties(self::Class? v) → dynamic {
+  self::Number n0 = new self::Number::•(0);
+  self::Number n1 = new self::Number::•(1);
+  self::Number n2 = new self::Number::•(2);
+  self::expect(n0, let final self::Class? #t261 = v in #t261 == null ?{self::Number?} null : self::ClassExtension|get#property(#t261{self::Class}), v == null);
+  self::expect(n1, let final self::Class? #t262 = v in #t262 == null ?{self::Number?} null : let final self::Number #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262{self::Class}), n1) in let final void #t264 = self::ClassExtension|set#property(#t262{self::Class}, #t263) in #t263, v == null);
+  self::expect(n2, let final self::Class? #t265 = v in #t265 == null ?{self::Number?} null : let final self::Number #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265{self::Class}), n1) in let final void #t267 = self::ClassExtension|set#property(#t265{self::Class}, #t266) in #t266, v == null);
+  self::expect(n0, let final self::Class? #t268 = v in #t268 == null ?{self::Number?} null : let final self::Number #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268{self::Class}), n2) in let final void #t270 = self::ClassExtension|set#property(#t268{self::Class}, #t269) in #t269, v == null);
+  self::expect(n1, let final self::Class? #t271 = v in #t271 == null ?{self::Number?} null : let final self::Number #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271{self::Class}), n1) in let final void #t273 = self::ClassExtension|set#property(#t271{self::Class}, #t272) in #t272, v == null);
+  self::expect(n0, let final self::Class? #t274 = v in #t274 == null ?{self::Number?} null : let final self::Number #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274{self::Class}), n1) in let final void #t276 = self::ClassExtension|set#property(#t274{self::Class}, #t275) in #t275, v == null);
+  self::expect(n1, let final self::Class? #t277 = v in #t277 == null ?{self::Number?} null : let final self::Number #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277{self::Class}), 1) in let final void #t279 = self::ClassExtension|set#property(#t277{self::Class}, #t278) in #t278, v == null);
+  self::expect(n0, let final self::Class? #t280 = v in #t280 == null ?{self::Number?} null : let final self::Number #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280{self::Class}), 1) in let final void #t282 = self::ClassExtension|set#property(#t280{self::Class}, #t281) in #t281, v == null);
+  self::expect(n0, let final self::Class? #t283 = v in #t283 == null ?{self::Number?} null : let final self::Number #t284 = self::ClassExtension|get#property(#t283{self::Class}) in let final self::Number #t285 = let final self::Number #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283{self::Class}, #t286) in #t286 in #t284, v == null);
+  self::expect(n1, let final self::Class? #t288 = v in #t288 == null ?{self::Number?} null : let final self::Number #t289 = self::ClassExtension|get#property(#t288{self::Class}) in let final self::Number #t290 = let final self::Number #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288{self::Class}, #t291) in #t291 in #t289, v == null);
+  self::expect(n0, let final self::Class? #t293 = v in #t293 == null ?{self::Number?} null : self::ClassExtension|get#property(#t293{self::Class}), v == null);
+  self::expect(n0, let final self::Class? #t294 = v in #t294 == null ?{self::Number?} null : self::ClassExtension|get#property(#t294{self::Class}), v == null);
+  let final self::Class? #t295 = v in #t295 == null ?{self::Number?} null : self::ClassExtension|set#property(#t295{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t295{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t296 = v in #t296 == null ?{self::Number?} null : self::ClassExtension|get#property(#t296{self::Class}), v == null);
+  let final self::Class? #t297 = v in #t297 == null ?{self::Number?} null : self::ClassExtension|set#property(#t297{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t297{self::Class}), n1));
+  self::expect(n2, let final self::Class? #t298 = v in #t298 == null ?{self::Number?} null : self::ClassExtension|get#property(#t298{self::Class}), v == null);
+  let final self::Class? #t299 = v in #t299 == null ?{self::Number?} null : self::ClassExtension|set#property(#t299{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t299{self::Class}), n2));
+  self::expect(n0, let final self::Class? #t300 = v in #t300 == null ?{self::Number?} null : self::ClassExtension|get#property(#t300{self::Class}), v == null);
+  let final self::Class? #t301 = v in #t301 == null ?{self::Number?} null : self::ClassExtension|set#property(#t301{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t301{self::Class}), n1));
+  self::expect(n1, let final self::Class? #t302 = v in #t302 == null ?{self::Number?} null : self::ClassExtension|get#property(#t302{self::Class}), v == null);
+  let final self::Class? #t303 = v in #t303 == null ?{self::Number?} null : self::ClassExtension|set#property(#t303{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t303{self::Class}), n1));
+  self::expect(n0, let final self::Class? #t304 = v in #t304 == null ?{self::Number?} null : self::ClassExtension|get#property(#t304{self::Class}), v == null);
+  let final self::Class? #t305 = v in #t305 == null ?{self::Number?} null : let final self::Number #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305{self::Class}), 1) in let final void #t307 = self::ClassExtension|set#property(#t305{self::Class}, #t306) in #t306;
+  self::expect(n1, let final self::Class? #t308 = v in #t308 == null ?{self::Number?} null : self::ClassExtension|get#property(#t308{self::Class}), v == null);
+  let final self::Class? #t309 = v in #t309 == null ?{self::Number?} null : let final self::Number #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309{self::Class}), 1) in let final void #t311 = self::ClassExtension|set#property(#t309{self::Class}, #t310) in #t310;
+  self::expect(n0, let final self::Class? #t312 = v in #t312 == null ?{self::Number?} null : self::ClassExtension|get#property(#t312{self::Class}), v == null);
+  let final self::Class? #t313 = v in #t313 == null ?{self::Number?} null : self::ClassExtension|set#property(#t313{self::Class}, self::NumberExtension|+(self::ClassExtension|get#property(#t313{self::Class}), 1));
+  self::expect(n1, let final self::Class? #t314 = v in #t314 == null ?{self::Number?} null : self::ClassExtension|get#property(#t314{self::Class}), v == null);
+  let final self::Class? #t315 = v in #t315 == null ?{self::Number?} null : self::ClassExtension|set#property(#t315{self::Class}, self::NumberExtension|-(self::ClassExtension|get#property(#t315{self::Class}), 1));
+  self::expect(n0, let final self::Class? #t316 = v in #t316 == null ?{self::Number?} null : self::ClassExtension|get#property(#t316{self::Class}), v == null);
 }
-static method testExplicitNullAwareIntProperties(self::IntClass* v) → dynamic {
-  core::int* n0 = 0;
-  core::int* n1 = 1;
-  core::int* n2 = 2;
-  self::expect(n0, let final self::IntClass* #t317 = v in #t317 == null ?{core::int*} null : self::IntClassExtension|get#property(#t317), v == null);
-  self::expect(n1, let final self::IntClass* #t318 = v in #t318 == null ?{core::int*} null : let final core::int* #t319 = self::IntClassExtension|get#property(#t318).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t320 = self::IntClassExtension|set#property(#t318, #t319) in #t319, v == null);
-  self::expect(n2, let final self::IntClass* #t321 = v in #t321 == null ?{core::int*} null : let final core::int* #t322 = self::IntClassExtension|get#property(#t321).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t323 = self::IntClassExtension|set#property(#t321, #t322) in #t322, v == null);
-  self::expect(n0, let final self::IntClass* #t324 = v in #t324 == null ?{core::int*} null : let final core::int* #t325 = self::IntClassExtension|get#property(#t324).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t326 = self::IntClassExtension|set#property(#t324, #t325) in #t325, v == null);
-  self::expect(n1, let final self::IntClass* #t327 = v in #t327 == null ?{core::int*} null : let final core::int* #t328 = self::IntClassExtension|get#property(#t327).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t329 = self::IntClassExtension|set#property(#t327, #t328) in #t328, v == null);
-  self::expect(n0, let final self::IntClass* #t330 = v in #t330 == null ?{core::int*} null : let final core::int* #t331 = self::IntClassExtension|get#property(#t330).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t332 = self::IntClassExtension|set#property(#t330, #t331) in #t331, v == null);
-  self::expect(n1, let final self::IntClass* #t333 = v in #t333 == null ?{core::int*} null : let final core::int* #t334 = self::IntClassExtension|get#property(#t333).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t335 = self::IntClassExtension|set#property(#t333, #t334) in #t334, v == null);
-  self::expect(n0, let final self::IntClass* #t336 = v in #t336 == null ?{core::int*} null : let final core::int* #t337 = self::IntClassExtension|get#property(#t336).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t338 = self::IntClassExtension|set#property(#t336, #t337) in #t337, v == null);
-  self::expect(n0, let final self::IntClass* #t339 = v in #t339 == null ?{core::int*} null : let final core::int* #t340 = self::IntClassExtension|get#property(#t339) in let final core::int* #t341 = let final core::int* #t342 = #t340.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t343 = self::IntClassExtension|set#property(#t339, #t342) in #t342 in #t340, v == null);
-  self::expect(n1, let final self::IntClass* #t344 = v in #t344 == null ?{core::int*} null : let final core::int* #t345 = self::IntClassExtension|get#property(#t344) in let final core::int* #t346 = let final core::int* #t347 = #t345.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t348 = self::IntClassExtension|set#property(#t344, #t347) in #t347 in #t345, v == null);
-  self::expect(n0, let final self::IntClass* #t349 = v in #t349 == null ?{core::int*} null : self::IntClassExtension|get#property(#t349), v == null);
-  self::expect(n0, let final self::IntClass* #t350 = v in #t350 == null ?{core::int*} null : self::IntClassExtension|get#property(#t350), v == null);
-  let final self::IntClass* #t351 = v in #t351 == null ?{core::int*} null : self::IntClassExtension|set#property(#t351, self::IntClassExtension|get#property(#t351).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t352 = v in #t352 == null ?{core::int*} null : self::IntClassExtension|get#property(#t352), v == null);
-  let final self::IntClass* #t353 = v in #t353 == null ?{core::int*} null : self::IntClassExtension|set#property(#t353, self::IntClassExtension|get#property(#t353).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n2, let final self::IntClass* #t354 = v in #t354 == null ?{core::int*} null : self::IntClassExtension|get#property(#t354), v == null);
-  let final self::IntClass* #t355 = v in #t355 == null ?{core::int*} null : self::IntClassExtension|set#property(#t355, self::IntClassExtension|get#property(#t355).{core::num::-}(n2){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t356 = v in #t356 == null ?{core::int*} null : self::IntClassExtension|get#property(#t356), v == null);
-  let final self::IntClass* #t357 = v in #t357 == null ?{core::int*} null : self::IntClassExtension|set#property(#t357, self::IntClassExtension|get#property(#t357).{core::num::+}(n1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t358 = v in #t358 == null ?{core::int*} null : self::IntClassExtension|get#property(#t358), v == null);
-  let final self::IntClass* #t359 = v in #t359 == null ?{core::int*} null : self::IntClassExtension|set#property(#t359, self::IntClassExtension|get#property(#t359).{core::num::-}(n1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t360 = v in #t360 == null ?{core::int*} null : self::IntClassExtension|get#property(#t360), v == null);
-  let final self::IntClass* #t361 = v in #t361 == null ?{core::int*} null : let final core::int* #t362 = self::IntClassExtension|get#property(#t361).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t363 = self::IntClassExtension|set#property(#t361, #t362) in #t362;
-  self::expect(n1, let final self::IntClass* #t364 = v in #t364 == null ?{core::int*} null : self::IntClassExtension|get#property(#t364), v == null);
-  let final self::IntClass* #t365 = v in #t365 == null ?{core::int*} null : let final core::int* #t366 = self::IntClassExtension|get#property(#t365).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t367 = self::IntClassExtension|set#property(#t365, #t366) in #t366;
-  self::expect(n0, let final self::IntClass* #t368 = v in #t368 == null ?{core::int*} null : self::IntClassExtension|get#property(#t368), v == null);
-  let final self::IntClass* #t369 = v in #t369 == null ?{core::int*} null : self::IntClassExtension|set#property(#t369, self::IntClassExtension|get#property(#t369).{core::num::+}(1){(core::num*) →* core::int*});
-  self::expect(n1, let final self::IntClass* #t370 = v in #t370 == null ?{core::int*} null : self::IntClassExtension|get#property(#t370), v == null);
-  let final self::IntClass* #t371 = v in #t371 == null ?{core::int*} null : self::IntClassExtension|set#property(#t371, self::IntClassExtension|get#property(#t371).{core::num::-}(1){(core::num*) →* core::int*});
-  self::expect(n0, let final self::IntClass* #t372 = v in #t372 == null ?{core::int*} null : self::IntClassExtension|get#property(#t372), v == null);
+static method testExplicitNullAwareIntProperties(self::IntClass? v) → dynamic {
+  core::int n0 = 0;
+  core::int n1 = 1;
+  core::int n2 = 2;
+  self::expect(n0, let final self::IntClass? #t317 = v in #t317 == null ?{core::int?} null : self::IntClassExtension|get#property(#t317{self::IntClass}), v == null);
+  self::expect(n1, let final self::IntClass? #t318 = v in #t318 == null ?{core::int?} null : let final core::int #t319 = self::IntClassExtension|get#property(#t318{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t320 = self::IntClassExtension|set#property(#t318{self::IntClass}, #t319) in #t319, v == null);
+  self::expect(n2, let final self::IntClass? #t321 = v in #t321 == null ?{core::int?} null : let final core::int #t322 = self::IntClassExtension|get#property(#t321{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t323 = self::IntClassExtension|set#property(#t321{self::IntClass}, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass? #t324 = v in #t324 == null ?{core::int?} null : let final core::int #t325 = self::IntClassExtension|get#property(#t324{self::IntClass}).{core::num::-}(n2){(core::num) → core::int} in let final void #t326 = self::IntClassExtension|set#property(#t324{self::IntClass}, #t325) in #t325, v == null);
+  self::expect(n1, let final self::IntClass? #t327 = v in #t327 == null ?{core::int?} null : let final core::int #t328 = self::IntClassExtension|get#property(#t327{self::IntClass}).{core::num::+}(n1){(core::num) → core::int} in let final void #t329 = self::IntClassExtension|set#property(#t327{self::IntClass}, #t328) in #t328, v == null);
+  self::expect(n0, let final self::IntClass? #t330 = v in #t330 == null ?{core::int?} null : let final core::int #t331 = self::IntClassExtension|get#property(#t330{self::IntClass}).{core::num::-}(n1){(core::num) → core::int} in let final void #t332 = self::IntClassExtension|set#property(#t330{self::IntClass}, #t331) in #t331, v == null);
+  self::expect(n1, let final self::IntClass? #t333 = v in #t333 == null ?{core::int?} null : let final core::int #t334 = self::IntClassExtension|get#property(#t333{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t335 = self::IntClassExtension|set#property(#t333{self::IntClass}, #t334) in #t334, v == null);
+  self::expect(n0, let final self::IntClass? #t336 = v in #t336 == null ?{core::int?} null : let final core::int #t337 = self::IntClassExtension|get#property(#t336{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t338 = self::IntClassExtension|set#property(#t336{self::IntClass}, #t337) in #t337, v == null);
+  self::expect(n0, let final self::IntClass? #t339 = v in #t339 == null ?{core::int?} null : let final core::int #t340 = self::IntClassExtension|get#property(#t339{self::IntClass}) in let final core::int #t341 = let final core::int #t342 = #t340.{core::num::+}(1){(core::num) → core::int} in let final void #t343 = self::IntClassExtension|set#property(#t339{self::IntClass}, #t342) in #t342 in #t340, v == null);
+  self::expect(n1, let final self::IntClass? #t344 = v in #t344 == null ?{core::int?} null : let final core::int #t345 = self::IntClassExtension|get#property(#t344{self::IntClass}) in let final core::int #t346 = let final core::int #t347 = #t345.{core::num::-}(1){(core::num) → core::int} in let final void #t348 = self::IntClassExtension|set#property(#t344{self::IntClass}, #t347) in #t347 in #t345, v == null);
+  self::expect(n0, let final self::IntClass? #t349 = v in #t349 == null ?{core::int?} null : self::IntClassExtension|get#property(#t349{self::IntClass}), v == null);
+  self::expect(n0, let final self::IntClass? #t350 = v in #t350 == null ?{core::int?} null : self::IntClassExtension|get#property(#t350{self::IntClass}), v == null);
+  let final self::IntClass? #t351 = v in #t351 == null ?{core::int?} null : self::IntClassExtension|set#property(#t351{self::IntClass}, self::IntClassExtension|get#property(#t351{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t352 = v in #t352 == null ?{core::int?} null : self::IntClassExtension|get#property(#t352{self::IntClass}), v == null);
+  let final self::IntClass? #t353 = v in #t353 == null ?{core::int?} null : self::IntClassExtension|set#property(#t353{self::IntClass}, self::IntClassExtension|get#property(#t353{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n2, let final self::IntClass? #t354 = v in #t354 == null ?{core::int?} null : self::IntClassExtension|get#property(#t354{self::IntClass}), v == null);
+  let final self::IntClass? #t355 = v in #t355 == null ?{core::int?} null : self::IntClassExtension|set#property(#t355{self::IntClass}, self::IntClassExtension|get#property(#t355{self::IntClass}).{core::num::-}(n2){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t356 = v in #t356 == null ?{core::int?} null : self::IntClassExtension|get#property(#t356{self::IntClass}), v == null);
+  let final self::IntClass? #t357 = v in #t357 == null ?{core::int?} null : self::IntClassExtension|set#property(#t357{self::IntClass}, self::IntClassExtension|get#property(#t357{self::IntClass}).{core::num::+}(n1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t358 = v in #t358 == null ?{core::int?} null : self::IntClassExtension|get#property(#t358{self::IntClass}), v == null);
+  let final self::IntClass? #t359 = v in #t359 == null ?{core::int?} null : self::IntClassExtension|set#property(#t359{self::IntClass}, self::IntClassExtension|get#property(#t359{self::IntClass}).{core::num::-}(n1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t360 = v in #t360 == null ?{core::int?} null : self::IntClassExtension|get#property(#t360{self::IntClass}), v == null);
+  let final self::IntClass? #t361 = v in #t361 == null ?{core::int?} null : let final core::int #t362 = self::IntClassExtension|get#property(#t361{self::IntClass}).{core::num::+}(1){(core::num) → core::int} in let final void #t363 = self::IntClassExtension|set#property(#t361{self::IntClass}, #t362) in #t362;
+  self::expect(n1, let final self::IntClass? #t364 = v in #t364 == null ?{core::int?} null : self::IntClassExtension|get#property(#t364{self::IntClass}), v == null);
+  let final self::IntClass? #t365 = v in #t365 == null ?{core::int?} null : let final core::int #t366 = self::IntClassExtension|get#property(#t365{self::IntClass}).{core::num::-}(1){(core::num) → core::int} in let final void #t367 = self::IntClassExtension|set#property(#t365{self::IntClass}, #t366) in #t366;
+  self::expect(n0, let final self::IntClass? #t368 = v in #t368 == null ?{core::int?} null : self::IntClassExtension|get#property(#t368{self::IntClass}), v == null);
+  let final self::IntClass? #t369 = v in #t369 == null ?{core::int?} null : self::IntClassExtension|set#property(#t369{self::IntClass}, self::IntClassExtension|get#property(#t369{self::IntClass}).{core::num::+}(1){(core::num) → core::int});
+  self::expect(n1, let final self::IntClass? #t370 = v in #t370 == null ?{core::int?} null : self::IntClassExtension|get#property(#t370{self::IntClass}), v == null);
+  let final self::IntClass? #t371 = v in #t371 == null ?{core::int?} null : self::IntClassExtension|set#property(#t371{self::IntClass}, self::IntClassExtension|get#property(#t371{self::IntClass}).{core::num::-}(1){(core::num) → core::int});
+  self::expect(n0, let final self::IntClass? #t372 = v in #t372 == null ?{core::int?} null : self::IntClassExtension|get#property(#t372{self::IntClass}), v == null);
 }
 static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
-  if(expectNull as{TypeError,ForDynamic} core::bool*) {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
     expected = null;
   }
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart b/pkg/front_end/testcases/extensions/conflict_with_object.dart
index 41b089d..fb9cc65 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart
@@ -1,11 +1,11 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on String {
   int get noSuchMethod => 42;
   void set hashCode(int value) {}
-  int runtimeType() {}
+  int runtimeType() => 0;
   operator ==(other) => false;
   static String toString() => 'Foo';
 }
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline.expect
index 2e92f04..2c7a9fa 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline.expect
@@ -1,8 +1,7 @@
-// @dart = 2.9
 extension Extension on String {
   int get noSuchMethod => 42;
   void set hashCode(int value) {}
-  int runtimeType() {}
+  int runtimeType() => 0;
   operator ==(other) => false;
   static String toString() => 'Foo';
 }
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline_modelled.expect
index a4cefaa..5ce2bf8 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.textual_outline_modelled.expect
@@ -1,10 +1,9 @@
-// @dart = 2.9
 errors() {}
 expect(expected, actual) {}
 
 extension Extension on String {
   int get noSuchMethod => 42;
-  int runtimeType() {}
+  int runtimeType() => 0;
   operator ==(other) => false;
   static String toString() => 'Foo';
   void set hashCode(int value) {}
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.expect
index 101c651..ec46c28 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -7,7 +7,7 @@
 //           ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
-//   int runtimeType() {}
+//   int runtimeType() => 0;
 //       ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
@@ -40,7 +40,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   get noSuchMethod = self::Extension|get#noSuchMethod;
   method runtimeType = self::Extension|runtimeType;
   tearoff runtimeType = self::Extension|get#runtimeType;
@@ -48,33 +48,34 @@
   static method toString = self::Extension|toString;
   set hashCode = self::Extension|set#hashCode;
 }
-static method Extension|get#noSuchMethod(lowered final core::String* #this) → core::int*
+static method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
   return 42;
-static method Extension|set#hashCode(lowered final core::String* #this, core::int* value) → void {}
-static method Extension|runtimeType(lowered final core::String* #this) → core::int* {}
-static method Extension|get#runtimeType(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self::Extension|runtimeType(#this);
-static method Extension|==(lowered final core::String* #this, dynamic other) → dynamic
+static method Extension|set#hashCode(lowered final core::String #this, core::int value) → void {}
+static method Extension|runtimeType(lowered final core::String #this) → core::int
+  return 0;
+static method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
+  return () → core::int => self::Extension|runtimeType(#this);
+static method Extension|==(lowered final core::String #this, dynamic other) → dynamic
   return false;
-static method Extension|toString() → core::String*
+static method Extension|toString() → core::String
   return "Foo";
 static method main() → dynamic {
-  core::int* value;
-  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} is core::Function*);
+  core::int value;
+  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} is{ForNonNullableByDefault} core::Function);
   value = self::Extension|get#noSuchMethod("");
   self::Extension|set#hashCode("", 42);
-  self::expect(true, "".{core::Object::runtimeType}{core::Type*} is core::Type*);
-  self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+  self::expect(true, "".{core::Object::runtimeType}{core::Type} is{ForNonNullableByDefault} core::Type);
+  self::expect(true, self::Extension|get#runtimeType("") is{ForNonNullableByDefault} core::Function);
   value = self::Extension|runtimeType("");
-  self::expect(true, "" =={core::String::==}{(core::Object*) →* core::bool*} "");
+  self::expect(true, "" =={core::String::==}{(core::Object) → core::bool} "");
   self::expect("Foo", self::Extension|toString());
 }
 static method errors() → dynamic {
-  core::int* value;
+  core::int value;
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
  - 'Invocation' is from 'dart:core'.
   value = \"\".noSuchMethod;
-             ^" in "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} as{TypeError} core::int*;
+             ^" in "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} as{TypeError,ForNonNullableByDefault} core::int;
   invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
   \"\".hashCode = 42;
@@ -82,10 +83,10 @@
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
  - 'Type' is from 'dart:core'.
   value = \"\".runtimeType;
-             ^" in "".{core::Object::runtimeType}{core::Type*} as{TypeError} core::int*;
+             ^" in "".{core::Object::runtimeType}{core::Type} as{TypeError,ForNonNullableByDefault} core::int;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect
index 101c651..ec46c28 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -7,7 +7,7 @@
 //           ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
-//   int runtimeType() {}
+//   int runtimeType() => 0;
 //       ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
@@ -40,7 +40,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   get noSuchMethod = self::Extension|get#noSuchMethod;
   method runtimeType = self::Extension|runtimeType;
   tearoff runtimeType = self::Extension|get#runtimeType;
@@ -48,33 +48,34 @@
   static method toString = self::Extension|toString;
   set hashCode = self::Extension|set#hashCode;
 }
-static method Extension|get#noSuchMethod(lowered final core::String* #this) → core::int*
+static method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
   return 42;
-static method Extension|set#hashCode(lowered final core::String* #this, core::int* value) → void {}
-static method Extension|runtimeType(lowered final core::String* #this) → core::int* {}
-static method Extension|get#runtimeType(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self::Extension|runtimeType(#this);
-static method Extension|==(lowered final core::String* #this, dynamic other) → dynamic
+static method Extension|set#hashCode(lowered final core::String #this, core::int value) → void {}
+static method Extension|runtimeType(lowered final core::String #this) → core::int
+  return 0;
+static method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
+  return () → core::int => self::Extension|runtimeType(#this);
+static method Extension|==(lowered final core::String #this, dynamic other) → dynamic
   return false;
-static method Extension|toString() → core::String*
+static method Extension|toString() → core::String
   return "Foo";
 static method main() → dynamic {
-  core::int* value;
-  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} is core::Function*);
+  core::int value;
+  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} is{ForNonNullableByDefault} core::Function);
   value = self::Extension|get#noSuchMethod("");
   self::Extension|set#hashCode("", 42);
-  self::expect(true, "".{core::Object::runtimeType}{core::Type*} is core::Type*);
-  self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+  self::expect(true, "".{core::Object::runtimeType}{core::Type} is{ForNonNullableByDefault} core::Type);
+  self::expect(true, self::Extension|get#runtimeType("") is{ForNonNullableByDefault} core::Function);
   value = self::Extension|runtimeType("");
-  self::expect(true, "" =={core::String::==}{(core::Object*) →* core::bool*} "");
+  self::expect(true, "" =={core::String::==}{(core::Object) → core::bool} "");
   self::expect("Foo", self::Extension|toString());
 }
 static method errors() → dynamic {
-  core::int* value;
+  core::int value;
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
  - 'Invocation' is from 'dart:core'.
   value = \"\".noSuchMethod;
-             ^" in "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} as{TypeError} core::int*;
+             ^" in "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} as{TypeError,ForNonNullableByDefault} core::int;
   invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
   \"\".hashCode = 42;
@@ -82,10 +83,10 @@
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
  - 'Type' is from 'dart:core'.
   value = \"\".runtimeType;
-             ^" in "".{core::Object::runtimeType}{core::Type*} as{TypeError} core::int*;
+             ^" in "".{core::Object::runtimeType}{core::Type} as{TypeError,ForNonNullableByDefault} core::int;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.outline.expect
index 500096d..1ec3424 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -7,7 +7,7 @@
 //           ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
-//   int runtimeType() {}
+//   int runtimeType() => 0;
 //       ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
@@ -25,7 +25,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   get noSuchMethod = self::Extension|get#noSuchMethod;
   method runtimeType = self::Extension|runtimeType;
   tearoff runtimeType = self::Extension|get#runtimeType;
@@ -33,17 +33,17 @@
   static method toString = self::Extension|toString;
   set hashCode = self::Extension|set#hashCode;
 }
-static method Extension|get#noSuchMethod(lowered final core::String* #this) → core::int*
+static method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
   ;
-static method Extension|set#hashCode(lowered final core::String* #this, core::int* value) → void
+static method Extension|set#hashCode(lowered final core::String #this, core::int value) → void
   ;
-static method Extension|runtimeType(lowered final core::String* #this) → core::int*
+static method Extension|runtimeType(lowered final core::String #this) → core::int
   ;
-static method Extension|get#runtimeType(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self::Extension|runtimeType(#this);
-static method Extension|==(lowered final core::String* #this, dynamic other) → dynamic
+static method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
+  return () → core::int => self::Extension|runtimeType(#this);
+static method Extension|==(lowered final core::String #this, dynamic other) → dynamic
   ;
-static method Extension|toString() → core::String*
+static method Extension|toString() → core::String
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.transformed.expect
index bfce2e3..a49ebae 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -7,7 +7,7 @@
 //           ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
-//   int runtimeType() {}
+//   int runtimeType() => 0;
 //       ^^^^^^^^^^^
 //
 // pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
@@ -40,7 +40,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   get noSuchMethod = self::Extension|get#noSuchMethod;
   method runtimeType = self::Extension|runtimeType;
   tearoff runtimeType = self::Extension|get#runtimeType;
@@ -48,33 +48,34 @@
   static method toString = self::Extension|toString;
   set hashCode = self::Extension|set#hashCode;
 }
-static method Extension|get#noSuchMethod(lowered final core::String* #this) → core::int*
+static method Extension|get#noSuchMethod(lowered final core::String #this) → core::int
   return 42;
-static method Extension|set#hashCode(lowered final core::String* #this, core::int* value) → void {}
-static method Extension|runtimeType(lowered final core::String* #this) → core::int* {}
-static method Extension|get#runtimeType(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self::Extension|runtimeType(#this);
-static method Extension|==(lowered final core::String* #this, dynamic other) → dynamic
+static method Extension|set#hashCode(lowered final core::String #this, core::int value) → void {}
+static method Extension|runtimeType(lowered final core::String #this) → core::int
+  return 0;
+static method Extension|get#runtimeType(lowered final core::String #this) → () → core::int
+  return () → core::int => self::Extension|runtimeType(#this);
+static method Extension|==(lowered final core::String #this, dynamic other) → dynamic
   return false;
-static method Extension|toString() → core::String*
+static method Extension|toString() → core::String
   return "Foo";
 static method main() → dynamic {
-  core::int* value;
-  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} is core::Function*);
+  core::int value;
+  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} is{ForNonNullableByDefault} core::Function);
   value = self::Extension|get#noSuchMethod("");
   self::Extension|set#hashCode("", 42);
-  self::expect(true, "".{core::Object::runtimeType}{core::Type*} is core::Type*);
-  self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+  self::expect(true, "".{core::Object::runtimeType}{core::Type} is{ForNonNullableByDefault} core::Type);
+  self::expect(true, self::Extension|get#runtimeType("") is{ForNonNullableByDefault} core::Function);
   value = self::Extension|runtimeType("");
-  self::expect(true, "" =={core::String::==}{(core::Object*) →* core::bool*} "");
+  self::expect(true, "" =={core::String::==}{(core::Object) → core::bool} "");
   self::expect("Foo", self::Extension|toString());
 }
 static method errors() → dynamic {
-  core::int* value;
+  core::int value;
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
  - 'Invocation' is from 'dart:core'.
   value = \"\".noSuchMethod;
-             ^" in "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} as{TypeError} core::int*;
+             ^" in "".{core::Object::noSuchMethod}{(core::Invocation) → dynamic} as{TypeError,ForNonNullableByDefault} core::int;
   invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
   \"\".hashCode = 42;
@@ -82,10 +83,10 @@
   value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
  - 'Type' is from 'dart:core'.
   value = \"\".runtimeType;
-             ^" in "".{core::Object::runtimeType}{core::Type*} as{TypeError} core::int*;
+             ^" in "".{core::Object::runtimeType}{core::Type} as{TypeError,ForNonNullableByDefault} core::int;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart b/pkg/front_end/testcases/extensions/conflicts.dart
index 73581ca..b05aa28 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart
+++ b/pkg/front_end/testcases/extensions/conflicts.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class1 {
 }
 class Class2 {}
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline.expect
index 2ecd835..0f53c9b 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {}
 
 class Class2 {}
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline_modelled.expect
index e713b85..481736e 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {}
 
 class Class2 {}
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.weak.expect b/pkg/front_end/testcases/extensions/conflicts.dart.weak.expect
index 3373345..e9568ce 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,62 +26,42 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  synthetic constructor •() → self::Class2*
+  synthetic constructor •() → self::Class2
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension DuplicateExtensionName on self::Class1* {
+extension DuplicateExtensionName on self::Class1 {
   method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
   tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
   method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
   tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
 }
-extension UniqueExtensionName on self::Class1* {
+extension UniqueExtensionName on self::Class1 {
   method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
   tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
 }
-static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1* #this) → dynamic {}
-static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1 #this) → dynamic {}
+static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
-static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1* #this) → dynamic
+static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1 #this) → dynamic
   return 1;
-static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
-static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1* #this) → dynamic
+static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1 #this) → dynamic
   return 1;
-static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1* #this) → () →* dynamic
+static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
 static method main() → dynamic {
-  self::Class1* c1 = new self::Class1::•();
+  self::Class1 c1 = new self::Class1::•();
   self::DuplicateExtensionName|uniqueMethod1(c1);
 }
 static method errors() → dynamic {
-  self::Class2* c2 = new self::Class2::•();
+  self::Class2 c2 = new self::Class2::•();
   invalid-expression "pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
  - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect
index 3373345..e9568ce 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,62 +26,42 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  synthetic constructor •() → self::Class2*
+  synthetic constructor •() → self::Class2
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension DuplicateExtensionName on self::Class1* {
+extension DuplicateExtensionName on self::Class1 {
   method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
   tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
   method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
   tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
 }
-extension UniqueExtensionName on self::Class1* {
+extension UniqueExtensionName on self::Class1 {
   method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
   tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
 }
-static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1* #this) → dynamic {}
-static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1 #this) → dynamic {}
+static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
-static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1* #this) → dynamic
+static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1 #this) → dynamic
   return 1;
-static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
-static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1* #this) → dynamic
+static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1 #this) → dynamic
   return 1;
-static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1* #this) → () →* dynamic
+static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
 static method main() → dynamic {
-  self::Class1* c1 = new self::Class1::•();
+  self::Class1 c1 = new self::Class1::•();
   self::DuplicateExtensionName|uniqueMethod1(c1);
 }
 static method errors() → dynamic {
-  self::Class2* c2 = new self::Class2::•();
+  self::Class2 c2 = new self::Class2::•();
   invalid-expression "pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
  - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/conflicts.dart.weak.outline.expect
index 4e95f3b..ab3ac2b 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -20,54 +20,34 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  synthetic constructor •() → self::Class2*
+  synthetic constructor •() → self::Class2
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension DuplicateExtensionName on self::Class1* {
+extension DuplicateExtensionName on self::Class1 {
   method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
   tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
   method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
   tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
 }
-extension UniqueExtensionName on self::Class1* {
+extension UniqueExtensionName on self::Class1 {
   method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
   tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
 }
-static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1* #this) → dynamic
+static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1 #this) → dynamic
   ;
-static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
-static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1* #this) → dynamic
+static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1 #this) → dynamic
   ;
-static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
-static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1* #this) → dynamic
+static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1 #this) → dynamic
   ;
-static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1* #this) → () →* dynamic
+static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/conflicts.dart.weak.transformed.expect
index 3373345..e9568ce 100644
--- a/pkg/front_end/testcases/extensions/conflicts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,62 +26,42 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  synthetic constructor •() → self::Class2*
+  synthetic constructor •() → self::Class2
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension DuplicateExtensionName on self::Class1* {
+extension DuplicateExtensionName on self::Class1 {
   method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
   tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
   method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
   tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
 }
-extension UniqueExtensionName on self::Class1* {
+extension UniqueExtensionName on self::Class1 {
   method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
   tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
 }
-static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1* #this) → dynamic {}
-static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1 #this) → dynamic {}
+static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
-static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1* #this) → dynamic
+static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1 #this) → dynamic
   return 1;
-static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1* #this) → () →* dynamic
+static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
-static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1* #this) → dynamic
+static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1 #this) → dynamic
   return 1;
-static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1* #this) → () →* dynamic
+static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1 #this) → () → dynamic
   return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
 static method main() → dynamic {
-  self::Class1* c1 = new self::Class1::•();
+  self::Class1 c1 = new self::Class1::•();
   self::DuplicateExtensionName|uniqueMethod1(c1);
 }
 static method errors() → dynamic {
-  self::Class2* c2 = new self::Class2::•();
+  self::Class2 c2 = new self::Class2::•();
   invalid-expression "pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
  - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
diff --git a/pkg/front_end/testcases/extensions/default_values.dart b/pkg/front_end/testcases/extensions/default_values.dart
index cbe9d36..eb948c2 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart
+++ b/pkg/front_end/testcases/extensions/default_values.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/default_values.dart.textual_outline.expect
index 07692f8..76863ce 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/default_values.dart.textual_outline_modelled.expect
index 75eaf11..dac2c87e 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.weak.expect b/pkg/front_end/testcases/extensions/default_values.dart.weak.expect
index 99dd7ec..06ce1d1 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.weak.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method0 = self::Extension|method0;
   tearoff method0 = self::Extension|get#method0;
   method method1 = self::Extension|method1;
@@ -28,41 +18,41 @@
   tearoff method3 = self::Extension|get#method3;
   static method staticMethod = self::Extension|staticMethod;
 }
-static method Extension|method0(lowered final self::Class* #this, [dynamic a = #C1]) → dynamic
+static method Extension|method0(lowered final self::Class #this, [dynamic a = #C1]) → dynamic
   return a;
-static method Extension|get#method0(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method0(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C1]) → dynamic => self::Extension|method0(#this, a);
-static method Extension|method1(lowered final self::Class* #this, [dynamic a = #C2]) → dynamic
+static method Extension|method1(lowered final self::Class #this, [dynamic a = #C2]) → dynamic
   return a;
-static method Extension|get#method1(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method1(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C2]) → dynamic => self::Extension|method1(#this, a);
-static method Extension|method2(lowered final self::Class* #this, {dynamic b = #C3}) → dynamic
+static method Extension|method2(lowered final self::Class #this, {dynamic b = #C3}) → dynamic
   return b;
-static method Extension|get#method2(lowered final self::Class* #this) → ({b: dynamic}) →* dynamic
+static method Extension|get#method2(lowered final self::Class #this) → ({b: dynamic}) → dynamic
   return ({dynamic b = #C3}) → dynamic => self::Extension|method2(#this, b: b);
-static method Extension|method3(lowered final self::Class* #this, {dynamic c = #C4}) → dynamic
+static method Extension|method3(lowered final self::Class #this, {dynamic c = #C4}) → dynamic
   return c{dynamic}.call();
-static method Extension|get#method3(lowered final self::Class* #this) → ({c: dynamic}) →* dynamic
+static method Extension|get#method3(lowered final self::Class #this) → ({c: dynamic}) → dynamic
   return ({dynamic c = #C4}) → dynamic => self::Extension|method3(#this, c: c);
 static method Extension|staticMethod() → dynamic
   return 123;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  ([dynamic]) →* dynamic tearOff0 = self::Extension|get#method0(c);
-  self::expect(0, tearOff0(0){([dynamic]) →* dynamic});
-  self::expect(null, tearOff0(){([dynamic]) →* dynamic});
-  ([dynamic]) →* dynamic tearOff1 = self::Extension|get#method1(c);
-  self::expect(0, tearOff1(0){([dynamic]) →* dynamic});
-  self::expect(42, tearOff1(){([dynamic]) →* dynamic});
-  ({b: dynamic}) →* dynamic tearOff2 = self::Extension|get#method2(c);
-  self::expect(0, tearOff2(b: 0){({b: dynamic}) →* dynamic});
-  self::expect(87, tearOff2(){({b: dynamic}) →* dynamic});
-  ({c: dynamic}) →* dynamic tearOff3 = self::Extension|get#method3(c);
-  self::expect(0, tearOff3(c: () → core::int* => 0){({c: dynamic}) →* dynamic});
-  self::expect(123, tearOff3(){({c: dynamic}) →* dynamic});
+  self::Class c = new self::Class::•();
+  ([dynamic]) → dynamic tearOff0 = self::Extension|get#method0(c);
+  self::expect(0, tearOff0(0){([dynamic]) → dynamic});
+  self::expect(null, tearOff0(){([dynamic]) → dynamic});
+  ([dynamic]) → dynamic tearOff1 = self::Extension|get#method1(c);
+  self::expect(0, tearOff1(0){([dynamic]) → dynamic});
+  self::expect(42, tearOff1(){([dynamic]) → dynamic});
+  ({b: dynamic}) → dynamic tearOff2 = self::Extension|get#method2(c);
+  self::expect(0, tearOff2(b: 0){({b: dynamic}) → dynamic});
+  self::expect(87, tearOff2(){({b: dynamic}) → dynamic});
+  ({c: dynamic}) → dynamic tearOff3 = self::Extension|get#method3(c);
+  self::expect(0, tearOff3(c: () → core::int => 0){({c: dynamic}) → dynamic});
+  self::expect(123, tearOff3(){({c: dynamic}) → dynamic});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect
index 99dd7ec..06ce1d1 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method0 = self::Extension|method0;
   tearoff method0 = self::Extension|get#method0;
   method method1 = self::Extension|method1;
@@ -28,41 +18,41 @@
   tearoff method3 = self::Extension|get#method3;
   static method staticMethod = self::Extension|staticMethod;
 }
-static method Extension|method0(lowered final self::Class* #this, [dynamic a = #C1]) → dynamic
+static method Extension|method0(lowered final self::Class #this, [dynamic a = #C1]) → dynamic
   return a;
-static method Extension|get#method0(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method0(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C1]) → dynamic => self::Extension|method0(#this, a);
-static method Extension|method1(lowered final self::Class* #this, [dynamic a = #C2]) → dynamic
+static method Extension|method1(lowered final self::Class #this, [dynamic a = #C2]) → dynamic
   return a;
-static method Extension|get#method1(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method1(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C2]) → dynamic => self::Extension|method1(#this, a);
-static method Extension|method2(lowered final self::Class* #this, {dynamic b = #C3}) → dynamic
+static method Extension|method2(lowered final self::Class #this, {dynamic b = #C3}) → dynamic
   return b;
-static method Extension|get#method2(lowered final self::Class* #this) → ({b: dynamic}) →* dynamic
+static method Extension|get#method2(lowered final self::Class #this) → ({b: dynamic}) → dynamic
   return ({dynamic b = #C3}) → dynamic => self::Extension|method2(#this, b: b);
-static method Extension|method3(lowered final self::Class* #this, {dynamic c = #C4}) → dynamic
+static method Extension|method3(lowered final self::Class #this, {dynamic c = #C4}) → dynamic
   return c{dynamic}.call();
-static method Extension|get#method3(lowered final self::Class* #this) → ({c: dynamic}) →* dynamic
+static method Extension|get#method3(lowered final self::Class #this) → ({c: dynamic}) → dynamic
   return ({dynamic c = #C4}) → dynamic => self::Extension|method3(#this, c: c);
 static method Extension|staticMethod() → dynamic
   return 123;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  ([dynamic]) →* dynamic tearOff0 = self::Extension|get#method0(c);
-  self::expect(0, tearOff0(0){([dynamic]) →* dynamic});
-  self::expect(null, tearOff0(){([dynamic]) →* dynamic});
-  ([dynamic]) →* dynamic tearOff1 = self::Extension|get#method1(c);
-  self::expect(0, tearOff1(0){([dynamic]) →* dynamic});
-  self::expect(42, tearOff1(){([dynamic]) →* dynamic});
-  ({b: dynamic}) →* dynamic tearOff2 = self::Extension|get#method2(c);
-  self::expect(0, tearOff2(b: 0){({b: dynamic}) →* dynamic});
-  self::expect(87, tearOff2(){({b: dynamic}) →* dynamic});
-  ({c: dynamic}) →* dynamic tearOff3 = self::Extension|get#method3(c);
-  self::expect(0, tearOff3(c: () → core::int* => 0){({c: dynamic}) →* dynamic});
-  self::expect(123, tearOff3(){({c: dynamic}) →* dynamic});
+  self::Class c = new self::Class::•();
+  ([dynamic]) → dynamic tearOff0 = self::Extension|get#method0(c);
+  self::expect(0, tearOff0(0){([dynamic]) → dynamic});
+  self::expect(null, tearOff0(){([dynamic]) → dynamic});
+  ([dynamic]) → dynamic tearOff1 = self::Extension|get#method1(c);
+  self::expect(0, tearOff1(0){([dynamic]) → dynamic});
+  self::expect(42, tearOff1(){([dynamic]) → dynamic});
+  ({b: dynamic}) → dynamic tearOff2 = self::Extension|get#method2(c);
+  self::expect(0, tearOff2(b: 0){({b: dynamic}) → dynamic});
+  self::expect(87, tearOff2(){({b: dynamic}) → dynamic});
+  ({c: dynamic}) → dynamic tearOff3 = self::Extension|get#method3(c);
+  self::expect(0, tearOff3(c: () → core::int => 0){({c: dynamic}) → dynamic});
+  self::expect(123, tearOff3(){({c: dynamic}) → dynamic});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/default_values.dart.weak.outline.expect
index a200896..b728e1a 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.weak.outline.expect
@@ -1,22 +1,12 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method0 = self::Extension|method0;
   tearoff method0 = self::Extension|get#method0;
   method method1 = self::Extension|method1;
@@ -27,21 +17,21 @@
   tearoff method3 = self::Extension|get#method3;
   static method staticMethod = self::Extension|staticMethod;
 }
-static method Extension|method0(lowered final self::Class* #this, [dynamic a]) → dynamic
+static method Extension|method0(lowered final self::Class #this, [dynamic a]) → dynamic
   ;
-static method Extension|get#method0(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method0(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a]) → dynamic => self::Extension|method0(#this, a);
-static method Extension|method1(lowered final self::Class* #this, [has-declared-initializer dynamic a]) → dynamic
+static method Extension|method1(lowered final self::Class #this, [has-declared-initializer dynamic a]) → dynamic
   ;
-static method Extension|get#method1(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method1(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a]) → dynamic => self::Extension|method1(#this, a);
-static method Extension|method2(lowered final self::Class* #this, {has-declared-initializer dynamic b}) → dynamic
+static method Extension|method2(lowered final self::Class #this, {has-declared-initializer dynamic b}) → dynamic
   ;
-static method Extension|get#method2(lowered final self::Class* #this) → ({b: dynamic}) →* dynamic
+static method Extension|get#method2(lowered final self::Class #this) → ({b: dynamic}) → dynamic
   return ({dynamic b}) → dynamic => self::Extension|method2(#this, b: b);
-static method Extension|method3(lowered final self::Class* #this, {has-declared-initializer dynamic c}) → dynamic
+static method Extension|method3(lowered final self::Class #this, {has-declared-initializer dynamic c}) → dynamic
   ;
-static method Extension|get#method3(lowered final self::Class* #this) → ({c: dynamic}) →* dynamic
+static method Extension|get#method3(lowered final self::Class #this) → ({c: dynamic}) → dynamic
   return ({dynamic c}) → dynamic => self::Extension|method3(#this, c: c);
 static method Extension|staticMethod() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/default_values.dart.weak.transformed.expect
index 99dd7ec..06ce1d1 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/default_values.dart.weak.transformed.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method0 = self::Extension|method0;
   tearoff method0 = self::Extension|get#method0;
   method method1 = self::Extension|method1;
@@ -28,41 +18,41 @@
   tearoff method3 = self::Extension|get#method3;
   static method staticMethod = self::Extension|staticMethod;
 }
-static method Extension|method0(lowered final self::Class* #this, [dynamic a = #C1]) → dynamic
+static method Extension|method0(lowered final self::Class #this, [dynamic a = #C1]) → dynamic
   return a;
-static method Extension|get#method0(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method0(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C1]) → dynamic => self::Extension|method0(#this, a);
-static method Extension|method1(lowered final self::Class* #this, [dynamic a = #C2]) → dynamic
+static method Extension|method1(lowered final self::Class #this, [dynamic a = #C2]) → dynamic
   return a;
-static method Extension|get#method1(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#method1(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic a = #C2]) → dynamic => self::Extension|method1(#this, a);
-static method Extension|method2(lowered final self::Class* #this, {dynamic b = #C3}) → dynamic
+static method Extension|method2(lowered final self::Class #this, {dynamic b = #C3}) → dynamic
   return b;
-static method Extension|get#method2(lowered final self::Class* #this) → ({b: dynamic}) →* dynamic
+static method Extension|get#method2(lowered final self::Class #this) → ({b: dynamic}) → dynamic
   return ({dynamic b = #C3}) → dynamic => self::Extension|method2(#this, b: b);
-static method Extension|method3(lowered final self::Class* #this, {dynamic c = #C4}) → dynamic
+static method Extension|method3(lowered final self::Class #this, {dynamic c = #C4}) → dynamic
   return c{dynamic}.call();
-static method Extension|get#method3(lowered final self::Class* #this) → ({c: dynamic}) →* dynamic
+static method Extension|get#method3(lowered final self::Class #this) → ({c: dynamic}) → dynamic
   return ({dynamic c = #C4}) → dynamic => self::Extension|method3(#this, c: c);
 static method Extension|staticMethod() → dynamic
   return 123;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  ([dynamic]) →* dynamic tearOff0 = self::Extension|get#method0(c);
-  self::expect(0, tearOff0(0){([dynamic]) →* dynamic});
-  self::expect(null, tearOff0(){([dynamic]) →* dynamic});
-  ([dynamic]) →* dynamic tearOff1 = self::Extension|get#method1(c);
-  self::expect(0, tearOff1(0){([dynamic]) →* dynamic});
-  self::expect(42, tearOff1(){([dynamic]) →* dynamic});
-  ({b: dynamic}) →* dynamic tearOff2 = self::Extension|get#method2(c);
-  self::expect(0, tearOff2(b: 0){({b: dynamic}) →* dynamic});
-  self::expect(87, tearOff2(){({b: dynamic}) →* dynamic});
-  ({c: dynamic}) →* dynamic tearOff3 = self::Extension|get#method3(c);
-  self::expect(0, tearOff3(c: () → core::int* => 0){({c: dynamic}) →* dynamic});
-  self::expect(123, tearOff3(){({c: dynamic}) →* dynamic});
+  self::Class c = new self::Class::•();
+  ([dynamic]) → dynamic tearOff0 = self::Extension|get#method0(c);
+  self::expect(0, tearOff0(0){([dynamic]) → dynamic});
+  self::expect(null, tearOff0(){([dynamic]) → dynamic});
+  ([dynamic]) → dynamic tearOff1 = self::Extension|get#method1(c);
+  self::expect(0, tearOff1(0){([dynamic]) → dynamic});
+  self::expect(42, tearOff1(){([dynamic]) → dynamic});
+  ({b: dynamic}) → dynamic tearOff2 = self::Extension|get#method2(c);
+  self::expect(0, tearOff2(b: 0){({b: dynamic}) → dynamic});
+  self::expect(87, tearOff2(){({b: dynamic}) → dynamic});
+  ({c: dynamic}) → dynamic tearOff3 = self::Extension|get#method3(c);
+  self::expect(0, tearOff3(c: () → core::int => 0){({c: dynamic}) → dynamic});
+  self::expect(123, tearOff3(){({c: dynamic}) → dynamic});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart
index 4935ff2..70ca3dd 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'deferred_explicit_access_lib.dart' deferred as prefix;
 
 main() async {
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline.expect
index 7ce2bbc..5dedc9b 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'deferred_explicit_access_lib.dart' deferred as prefix;
 
 main() async {}
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline_modelled.expect
index f02744c..45edf2b 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'deferred_explicit_access_lib.dart' deferred as prefix;
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.expect
index e5d181d..cc56e66 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,7 +17,7 @@
   await LoadLibrary(prefix);
   self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
   self::expect(0, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
-  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int* #t4 = 0 in let final core::int* #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int #t4 = 0 in let final core::int #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
   self::expect(84, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
   self::expect(85, let final dynamic #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
   self::expect(42, let final dynamic #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
@@ -25,15 +25,15 @@
   self::expect(87, let final dynamic #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -43,27 +43,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect
index e5d181d..cc56e66 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,7 +17,7 @@
   await LoadLibrary(prefix);
   self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
   self::expect(0, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
-  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int* #t4 = 0 in let final core::int* #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int #t4 = 0 in let final core::int #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
   self::expect(84, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
   self::expect(85, let final dynamic #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
   self::expect(42, let final dynamic #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
@@ -25,15 +25,15 @@
   self::expect(87, let final dynamic #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -43,27 +43,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.outline.expect
index b5db0d7..bf2f8ef 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -16,11 +16,11 @@
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = self2::Extension|staticField;
   static get staticProperty = get self2::Extension|staticProperty;
   static method staticMethod = self2::Extension|staticMethod;
@@ -30,25 +30,25 @@
   static set staticProperty = set self2::Extension|staticProperty;
   set property = self2::Extension|set#property;
 }
-static field core::int* Extension|staticField;
-static field core::int* topLevelField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField;
+static field core::int topLevelField;
+static get Extension|staticProperty() → core::int
   ;
-static set Extension|staticProperty(core::int* value) → void
+static set Extension|staticProperty(core::int value) → void
   ;
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   ;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
+static method Extension|get#property(lowered final core::int #this) → core::int
   ;
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#property(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|method(lowered final core::int* #this) → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
   ;
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => self2::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => self2::Extension|method(#this);
+static get topLevelProperty() → core::int
   ;
-static set topLevelProperty(core::int* value) → void
+static set topLevelProperty(core::int value) → void
   ;
 static method topLevelMethod() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.transformed.expect
index 612662d..484ac66 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -15,12 +15,12 @@
 import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
 
 static method main() → dynamic /* futureValueType= dynamic */ /* originally async */ {
-  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
   core::bool* :is_sync = false;
   dynamic :return_value;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
   function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
@@ -31,7 +31,7 @@
         :result_or_exception;
         self::expect(0, let final core::Object* #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
         self::expect(0, let final core::Object* #t3 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
-        self::expect(42, let final core::Object* #t4 = CheckLibraryIsLoaded(prefix) in let final core::int* #t5 = 0 in let final core::int* #t6 = 42 in let final void #t7 = def::Extension|set#property(#t5, #t6) in #t6);
+        self::expect(42, let final core::Object* #t4 = CheckLibraryIsLoaded(prefix) in let final core::int #t5 = 0 in let final core::int #t6 = 42 in let final void #t7 = def::Extension|set#property(#t5, #t6) in #t6);
         self::expect(84, let final core::Object* #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
         self::expect(85, let final core::Object* #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
         self::expect(42, let final core::Object* #t10 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
@@ -41,25 +41,25 @@
       asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
-    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
       asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_op(null, null){() →* dynamic};
+  :async_op(null, null){() → dynamic};
   :is_sync = true;
   return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -69,27 +69,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart b/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart
index 76a7d59..a85bb28 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access_lib.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on int {
   static int staticField = 0;
 
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart
index b289768b..c5d6507 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'deferred_explicit_access_lib.dart' deferred as prefix hide Extension;
 
 main() async {
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline.expect
index 6e5148b..cd5075c 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'deferred_explicit_access_lib.dart' deferred as prefix hide Extension;
 
 main() async {}
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline_modelled.expect
index 72a2f58..73bcfb8 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'deferred_explicit_access_lib.dart' deferred as prefix hide Extension;
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.expect
index 0b080b3..5ce08e9 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "deferred_explicit_access_lib.dart" as def;
 import "dart:core" as core;
@@ -16,15 +16,15 @@
   self::expect(87, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -34,27 +34,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect
index 0b080b3..5ce08e9 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "deferred_explicit_access_lib.dart" as def;
 import "dart:core" as core;
@@ -16,15 +16,15 @@
   self::expect(87, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -34,27 +34,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.outline.expect
index a0ceed4..1fbc675 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix hide Extension;
@@ -8,11 +8,11 @@
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = self2::Extension|staticField;
   static get staticProperty = get self2::Extension|staticProperty;
   static method staticMethod = self2::Extension|staticMethod;
@@ -22,25 +22,25 @@
   static set staticProperty = set self2::Extension|staticProperty;
   set property = self2::Extension|set#property;
 }
-static field core::int* Extension|staticField;
-static field core::int* topLevelField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField;
+static field core::int topLevelField;
+static get Extension|staticProperty() → core::int
   ;
-static set Extension|staticProperty(core::int* value) → void
+static set Extension|staticProperty(core::int value) → void
   ;
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   ;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
+static method Extension|get#property(lowered final core::int #this) → core::int
   ;
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#property(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|method(lowered final core::int* #this) → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
   ;
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => self2::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => self2::Extension|method(#this);
+static get topLevelProperty() → core::int
   ;
-static set topLevelProperty(core::int* value) → void
+static set topLevelProperty(core::int value) → void
   ;
 static method topLevelMethod() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.transformed.expect
index bc5853f..3769826 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
@@ -7,12 +7,12 @@
 import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix hide Extension;
 
 static method main() → dynamic /* futureValueType= dynamic */ /* originally async */ {
-  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
   core::bool* :is_sync = false;
   dynamic :return_value;
-  (dynamic) →* dynamic :async_op_then;
-  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
-  core::int* :await_jump_var = 0;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
   function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
@@ -32,25 +32,25 @@
       asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
-    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
       asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_op(null, null){() →* dynamic};
+  :async_op(null, null){() → dynamic};
   :is_sync = true;
   return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as def;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   static field staticField = def::Extension|staticField;
   static get staticProperty = get def::Extension|staticProperty;
   static method staticMethod = def::Extension|staticMethod;
@@ -60,27 +60,27 @@
   static set staticProperty = set def::Extension|staticProperty;
   set property = def::Extension|set#property;
 }
-static field core::int* Extension|staticField = 0;
-static field core::int* topLevelField = def::Extension|staticField;
-static get Extension|staticProperty() → core::int*
+static field core::int Extension|staticField = 0;
+static field core::int topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int
   return def::Extension|staticField;
-static set Extension|staticProperty(core::int* value) → void {
+static set Extension|staticProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|staticMethod() → core::int*
+static method Extension|staticMethod() → core::int
   return def::Extension|staticField;
-static method Extension|get#property(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+static method Extension|get#property(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|set#property(lowered final core::int #this, core::int value) → void {
   def::Extension|staticField = value;
 }
-static method Extension|method(lowered final core::int* #this) → core::int*
-  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
-static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
-  return () → core::int* => def::Extension|method(#this);
-static get topLevelProperty() → core::int*
+static method Extension|method(lowered final core::int #this) → core::int
+  return #this.{core::num::+}(def::Extension|staticField){(core::num) → core::int};
+static method Extension|get#method(lowered final core::int #this) → () → core::int
+  return () → core::int => def::Extension|method(#this);
+static get topLevelProperty() → core::int
   return def::Extension|staticField;
-static set topLevelProperty(core::int* value) → void {
+static set topLevelProperty(core::int value) → void {
   def::Extension|staticField = value;
 }
 static method topLevelMethod() → dynamic
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart b/pkg/front_end/testcases/extensions/direct_instance_access.dart
index f7368f0..9634d9d 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {
   var field;
 }
@@ -67,11 +67,11 @@
 }
 
 class GenericClass<T> {
-  T field;
+  T? field;
 }
 
 extension GenericExtension<T> on GenericClass<T> {
-  T readGetter() {
+  T? readGetter() {
     return property;
   }
 
@@ -79,11 +79,11 @@
     property = value;
   }
 
-  writeSetterOptional([T value]) {
+  writeSetterOptional([T? value]) {
    property = value;
   }
 
-  writeSetterNamed({T value}) {
+  writeSetterNamed({T? value}) {
     property = value;
   }
 
@@ -91,17 +91,17 @@
    property = value;
   }
 
-  genericWriteSetterOptional<S extends T>([S value]) {
+  genericWriteSetterOptional<S extends T>([S? value]) {
     property = value;
   }
 
-  genericWriteSetterNamed<S extends T>({S value}) {
+  genericWriteSetterNamed<S extends T>({S? value}) {
    property = value;
   }
 
-  T get property => this.field;
+  T? get property => this.field;
 
-  void set property(T value) {
+  void set property(T? value) {
     this.field = value;
   }
 
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline.expect
index 2ce2827..2d6c602 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   var field;
 }
@@ -20,19 +19,19 @@
 }
 
 class GenericClass<T> {
-  T field;
+  T? field;
 }
 
 extension GenericExtension<T> on GenericClass<T> {
-  T readGetter() {}
+  T? readGetter() {}
   writeSetterRequired(T value) {}
-  writeSetterOptional([T value]) {}
-  writeSetterNamed({T value}) {}
+  writeSetterOptional([T? value]) {}
+  writeSetterNamed({T? value}) {}
   genericWriteSetterRequired<S extends T>(S value) {}
-  genericWriteSetterOptional<S extends T>([S value]) {}
-  genericWriteSetterNamed<S extends T>({S value}) {}
-  T get property => this.field;
-  void set property(T value) {}
+  genericWriteSetterOptional<S extends T>([S? value]) {}
+  genericWriteSetterNamed<S extends T>({S? value}) {}
+  T? get property => this.field;
+  void set property(T? value) {}
   get tearOffGetterNoArgs => readGetter;
   get tearOffGetterRequired => writeSetterRequired;
   get tearOffGetterOptional => writeSetterOptional;
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline_modelled.expect
index 00f7edc..f282455 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.textual_outline_modelled.expect
@@ -1,10 +1,9 @@
-// @dart = 2.9
 class Class {
   var field;
 }
 
 class GenericClass<T> {
-  T field;
+  T? field;
 }
 
 extension Extension on Class {
@@ -24,10 +23,10 @@
 }
 
 extension GenericExtension<T> on GenericClass<T> {
-  T get property => this.field;
-  T readGetter() {}
-  genericWriteSetterNamed<S extends T>({S value}) {}
-  genericWriteSetterOptional<S extends T>([S value]) {}
+  T? get property => this.field;
+  T? readGetter() {}
+  genericWriteSetterNamed<S extends T>({S? value}) {}
+  genericWriteSetterOptional<S extends T>([S? value]) {}
   genericWriteSetterRequired<S extends T>(S value) {}
   get tearOffGetterGenericNamed => genericWriteSetterNamed;
   get tearOffGetterGenericOptional => genericWriteSetterOptional;
@@ -39,9 +38,9 @@
   getterCalls<S extends T>(S value) {}
   invocations<S extends T>(S value) {}
   tearOffs<S extends T>(S value) {}
-  void set property(T value) {}
-  writeSetterNamed({T value}) {}
-  writeSetterOptional([T value]) {}
+  void set property(T? value) {}
+  writeSetterNamed({T? value}) {}
+  writeSetterOptional([T? value]) {}
   writeSetterRequired(T value) {}
 }
 
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.expect
index d892e0f..68d2b7e 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.expect
@@ -1,40 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  covariant-by-class field self::GenericClass::T* field = null;
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::GenericClass::T? field = null;
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method readGetter = self::Extension|readGetter;
   tearoff readGetter = self::Extension|get#readGetter;
   method writeSetterRequired = self::Extension|writeSetterRequired;
@@ -56,7 +36,7 @@
   tearoff getterCalls = self::Extension|get#getterCalls;
   set property = self::Extension|set#property;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method readGetter = self::GenericExtension|readGetter;
   tearoff readGetter = self::GenericExtension|get#readGetter;
   method writeSetterRequired = self::GenericExtension|writeSetterRequired;
@@ -87,40 +67,40 @@
   tearoff getterCalls = self::GenericExtension|get#getterCalls;
   set property = self::GenericExtension|set#property;
 }
-static method Extension|get#readGetter(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#readGetter(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|readGetter(#this);
-static method Extension|readGetter(lowered final self::Class* #this) → dynamic {
+static method Extension|readGetter(lowered final self::Class #this) → dynamic {
   return self::Extension|get#property(#this);
 }
-static method Extension|writeSetterRequired(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|writeSetterRequired(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterRequired(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#writeSetterRequired(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
-static method Extension|writeSetterOptional(lowered final self::Class* #this, [dynamic value = #C1]) → dynamic {
+static method Extension|writeSetterOptional(lowered final self::Class #this, [dynamic value = #C1]) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterOptional(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#writeSetterOptional(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic value = #C1]) → dynamic => self::Extension|writeSetterOptional(#this, value);
-static method Extension|writeSetterNamed(lowered final self::Class* #this, {dynamic value = #C1}) → dynamic {
+static method Extension|writeSetterNamed(lowered final self::Class #this, {dynamic value = #C1}) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterNamed(lowered final self::Class* #this) → ({value: dynamic}) →* dynamic
+static method Extension|get#writeSetterNamed(lowered final self::Class #this) → ({value: dynamic}) → dynamic
   return ({dynamic value = #C1}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
-static method Extension|get#tearOffGetterNoArgs(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNoArgs(lowered final self::Class #this) → dynamic
   return self::Extension|get#readGetter(#this);
-static method Extension|get#tearOffGetterRequired(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterRequired(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterRequired(#this);
-static method Extension|get#tearOffGetterOptional(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterOptional(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterOptional(#this);
-static method Extension|get#tearOffGetterNamed(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNamed(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterNamed(#this);
-static method Extension|get#property(lowered final self::Class* #this) → dynamic
+static method Extension|get#property(lowered final self::Class #this) → dynamic
   return #this.{self::Class::field}{dynamic};
-static method Extension|set#property(lowered final self::Class* #this, dynamic value) → void {
+static method Extension|set#property(lowered final self::Class #this, dynamic value) → void {
   #this.{self::Class::field} = value;
 }
-static method Extension|invocations(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|invocations(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|readGetter(#this);
   self::Extension|writeSetterRequired(#this, value);
   self::Extension|writeSetterOptional(#this);
@@ -128,23 +108,23 @@
   self::Extension|writeSetterNamed(#this);
   self::Extension|writeSetterNamed(#this, value: value);
 }
-static method Extension|get#invocations(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#invocations(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
-static method Extension|get#tearOffs(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#tearOffs(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
-static method Extension|tearOffs(lowered final self::Class* #this, dynamic value) → dynamic {
-  () →* dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+static method Extension|tearOffs(lowered final self::Class #this, dynamic value) → dynamic {
+  () → dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
 }
-static method Extension|getterCalls(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|getterCalls(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|get#tearOffGetterNoArgs(#this){dynamic}.call();
   self::Extension|get#tearOffGetterRequired(#this){dynamic}.call(value);
   self::Extension|get#tearOffGetterOptional(#this){dynamic}.call();
@@ -152,144 +132,144 @@
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call();
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call(value: value);
 }
-static method Extension|get#getterCalls(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#getterCalls(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
-static method GenericExtension|readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T* {
-  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T*>(#this);
+static method GenericExtension|readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T%> #this) → self::GenericExtension|readGetter::T? {
+  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T%>(#this);
 }
-static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
-  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
-static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T*>(#this, value);
+static method GenericExtension|get#readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T%> #this) → () → self::GenericExtension|get#readGetter::T?
+  return () → self::GenericExtension|get#readGetter::T? => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T%>(#this);
+static method GenericExtension|writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T%> #this, self::GenericExtension|writeSetterRequired::T% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
-  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
-static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T*>(#this, value);
+static method GenericExtension|get#writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T%> #this) → (self::GenericExtension|get#writeSetterRequired::T%) → dynamic
+  return (self::GenericExtension|get#writeSetterRequired::T% value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T%>(#this, value);
+static method GenericExtension|writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T%> #this, [self::GenericExtension|writeSetterOptional::T? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
-  return ([self::GenericExtension|get#writeSetterOptional::T* value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
-static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T*>(#this, value);
+static method GenericExtension|get#writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T%> #this) → ([self::GenericExtension|get#writeSetterOptional::T?]) → dynamic
+  return ([self::GenericExtension|get#writeSetterOptional::T? value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T%>(#this, value);
+static method GenericExtension|writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T%> #this, {self::GenericExtension|writeSetterNamed::T? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
-  return ({self::GenericExtension|get#writeSetterNamed::T* value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
-static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T*>(#this, value);
+static method GenericExtension|get#writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T%> #this) → ({value: self::GenericExtension|get#writeSetterNamed::T?}) → dynamic
+  return ({self::GenericExtension|get#writeSetterNamed::T? value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T%>(#this, value: value);
+static method GenericExtension|genericWriteSetterRequired<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T%> #this, self::GenericExtension|genericWriteSetterRequired::S% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
-static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S% value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T%, S%>(#this, value);
+static method GenericExtension|genericWriteSetterOptional<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T%> #this, [self::GenericExtension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
-static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
-static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S?]) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S? value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T%, S%>(#this, value);
+static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({value: S?}) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({S? value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T%, S%>(#this, value: value);
+static method GenericExtension|genericWriteSetterNamed<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T%> #this, {self::GenericExtension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
-  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T*};
-static method GenericExtension|set#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T?};
+static method GenericExtension|set#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T%> #this, self::GenericExtension|set#property::T? value) → void {
   #this.{self::GenericClass::field} = value;
 }
-static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
-  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);
-static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T*>(#this);
-static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic {
-  self::GenericExtension|readGetter<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
+static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T%> #this) → dynamic
+  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T%>(#this);
+static method GenericExtension|get#tearOffGetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T%>(#this);
+static method GenericExtension|invocations<T extends core::Object? = dynamic, S extends self::GenericExtension|invocations::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T%> #this, self::GenericExtension|invocations::S% value) → dynamic {
+  self::GenericExtension|readGetter<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
 }
-static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
-static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic {
-  () →* self::GenericExtension|tearOffs::T* tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNoArgs(){() →* self::GenericExtension|tearOffs::T*};
-  (self::GenericExtension|tearOffs::T*) →* dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffRequired(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  ([self::GenericExtension|tearOffs::T*]) →* dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffOptional(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  tearOffOptional(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  ({value: self::GenericExtension|tearOffs::T*}) →* dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNamed(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>(S*) →* dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::T*>(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>([S*]) →* dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>({value: S*}) →* dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+static method GenericExtension|get#invocations<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T%> #this) → <S extends self::GenericExtension|get#invocations::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#invocations::T% = dynamic>(S% value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T%, S%>(#this, value);
+static method GenericExtension|tearOffs<T extends core::Object? = dynamic, S extends self::GenericExtension|tearOffs::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T%> #this, self::GenericExtension|tearOffs::S% value) → dynamic {
+  () → self::GenericExtension|tearOffs::T? tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNoArgs(){() → self::GenericExtension|tearOffs::T?};
+  (self::GenericExtension|tearOffs::T%) → dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffRequired(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  ([self::GenericExtension|tearOffs::T?]) → dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffOptional(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  tearOffOptional(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  ({value: self::GenericExtension|tearOffs::T?}) → dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNamed(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>(S%) → dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::T%>(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>([S?]) → dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>({value: S?}) → dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
 }
-static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
-static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic {
-  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value: value);
+static method GenericExtension|get#tearOffs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T%> #this) → <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S% value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T%, S%>(#this, value);
+static method GenericExtension|getterCalls<T extends core::Object? = dynamic, S extends self::GenericExtension|getterCalls::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T%> #this, self::GenericExtension|getterCalls::S% value) → dynamic {
+  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value: value);
 }
-static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
+static method GenericExtension|get#getterCalls<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T%> #this) → <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S% value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T%, S%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect
index d892e0f..68d2b7e 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect
@@ -1,40 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  covariant-by-class field self::GenericClass::T* field = null;
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::GenericClass::T? field = null;
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method readGetter = self::Extension|readGetter;
   tearoff readGetter = self::Extension|get#readGetter;
   method writeSetterRequired = self::Extension|writeSetterRequired;
@@ -56,7 +36,7 @@
   tearoff getterCalls = self::Extension|get#getterCalls;
   set property = self::Extension|set#property;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method readGetter = self::GenericExtension|readGetter;
   tearoff readGetter = self::GenericExtension|get#readGetter;
   method writeSetterRequired = self::GenericExtension|writeSetterRequired;
@@ -87,40 +67,40 @@
   tearoff getterCalls = self::GenericExtension|get#getterCalls;
   set property = self::GenericExtension|set#property;
 }
-static method Extension|get#readGetter(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#readGetter(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|readGetter(#this);
-static method Extension|readGetter(lowered final self::Class* #this) → dynamic {
+static method Extension|readGetter(lowered final self::Class #this) → dynamic {
   return self::Extension|get#property(#this);
 }
-static method Extension|writeSetterRequired(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|writeSetterRequired(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterRequired(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#writeSetterRequired(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
-static method Extension|writeSetterOptional(lowered final self::Class* #this, [dynamic value = #C1]) → dynamic {
+static method Extension|writeSetterOptional(lowered final self::Class #this, [dynamic value = #C1]) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterOptional(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#writeSetterOptional(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic value = #C1]) → dynamic => self::Extension|writeSetterOptional(#this, value);
-static method Extension|writeSetterNamed(lowered final self::Class* #this, {dynamic value = #C1}) → dynamic {
+static method Extension|writeSetterNamed(lowered final self::Class #this, {dynamic value = #C1}) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterNamed(lowered final self::Class* #this) → ({value: dynamic}) →* dynamic
+static method Extension|get#writeSetterNamed(lowered final self::Class #this) → ({value: dynamic}) → dynamic
   return ({dynamic value = #C1}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
-static method Extension|get#tearOffGetterNoArgs(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNoArgs(lowered final self::Class #this) → dynamic
   return self::Extension|get#readGetter(#this);
-static method Extension|get#tearOffGetterRequired(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterRequired(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterRequired(#this);
-static method Extension|get#tearOffGetterOptional(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterOptional(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterOptional(#this);
-static method Extension|get#tearOffGetterNamed(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNamed(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterNamed(#this);
-static method Extension|get#property(lowered final self::Class* #this) → dynamic
+static method Extension|get#property(lowered final self::Class #this) → dynamic
   return #this.{self::Class::field}{dynamic};
-static method Extension|set#property(lowered final self::Class* #this, dynamic value) → void {
+static method Extension|set#property(lowered final self::Class #this, dynamic value) → void {
   #this.{self::Class::field} = value;
 }
-static method Extension|invocations(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|invocations(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|readGetter(#this);
   self::Extension|writeSetterRequired(#this, value);
   self::Extension|writeSetterOptional(#this);
@@ -128,23 +108,23 @@
   self::Extension|writeSetterNamed(#this);
   self::Extension|writeSetterNamed(#this, value: value);
 }
-static method Extension|get#invocations(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#invocations(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
-static method Extension|get#tearOffs(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#tearOffs(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
-static method Extension|tearOffs(lowered final self::Class* #this, dynamic value) → dynamic {
-  () →* dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+static method Extension|tearOffs(lowered final self::Class #this, dynamic value) → dynamic {
+  () → dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
 }
-static method Extension|getterCalls(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|getterCalls(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|get#tearOffGetterNoArgs(#this){dynamic}.call();
   self::Extension|get#tearOffGetterRequired(#this){dynamic}.call(value);
   self::Extension|get#tearOffGetterOptional(#this){dynamic}.call();
@@ -152,144 +132,144 @@
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call();
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call(value: value);
 }
-static method Extension|get#getterCalls(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#getterCalls(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
-static method GenericExtension|readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T* {
-  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T*>(#this);
+static method GenericExtension|readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T%> #this) → self::GenericExtension|readGetter::T? {
+  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T%>(#this);
 }
-static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
-  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
-static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T*>(#this, value);
+static method GenericExtension|get#readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T%> #this) → () → self::GenericExtension|get#readGetter::T?
+  return () → self::GenericExtension|get#readGetter::T? => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T%>(#this);
+static method GenericExtension|writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T%> #this, self::GenericExtension|writeSetterRequired::T% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
-  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
-static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T*>(#this, value);
+static method GenericExtension|get#writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T%> #this) → (self::GenericExtension|get#writeSetterRequired::T%) → dynamic
+  return (self::GenericExtension|get#writeSetterRequired::T% value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T%>(#this, value);
+static method GenericExtension|writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T%> #this, [self::GenericExtension|writeSetterOptional::T? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
-  return ([self::GenericExtension|get#writeSetterOptional::T* value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
-static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T*>(#this, value);
+static method GenericExtension|get#writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T%> #this) → ([self::GenericExtension|get#writeSetterOptional::T?]) → dynamic
+  return ([self::GenericExtension|get#writeSetterOptional::T? value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T%>(#this, value);
+static method GenericExtension|writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T%> #this, {self::GenericExtension|writeSetterNamed::T? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
-  return ({self::GenericExtension|get#writeSetterNamed::T* value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
-static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T*>(#this, value);
+static method GenericExtension|get#writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T%> #this) → ({value: self::GenericExtension|get#writeSetterNamed::T?}) → dynamic
+  return ({self::GenericExtension|get#writeSetterNamed::T? value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T%>(#this, value: value);
+static method GenericExtension|genericWriteSetterRequired<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T%> #this, self::GenericExtension|genericWriteSetterRequired::S% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
-static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S% value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T%, S%>(#this, value);
+static method GenericExtension|genericWriteSetterOptional<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T%> #this, [self::GenericExtension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
-static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
-static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S?]) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S? value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T%, S%>(#this, value);
+static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({value: S?}) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({S? value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T%, S%>(#this, value: value);
+static method GenericExtension|genericWriteSetterNamed<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T%> #this, {self::GenericExtension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
-  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T*};
-static method GenericExtension|set#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T?};
+static method GenericExtension|set#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T%> #this, self::GenericExtension|set#property::T? value) → void {
   #this.{self::GenericClass::field} = value;
 }
-static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
-  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);
-static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T*>(#this);
-static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic {
-  self::GenericExtension|readGetter<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
+static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T%> #this) → dynamic
+  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T%>(#this);
+static method GenericExtension|get#tearOffGetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T%>(#this);
+static method GenericExtension|invocations<T extends core::Object? = dynamic, S extends self::GenericExtension|invocations::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T%> #this, self::GenericExtension|invocations::S% value) → dynamic {
+  self::GenericExtension|readGetter<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
 }
-static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
-static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic {
-  () →* self::GenericExtension|tearOffs::T* tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNoArgs(){() →* self::GenericExtension|tearOffs::T*};
-  (self::GenericExtension|tearOffs::T*) →* dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffRequired(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  ([self::GenericExtension|tearOffs::T*]) →* dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffOptional(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  tearOffOptional(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  ({value: self::GenericExtension|tearOffs::T*}) →* dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNamed(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>(S*) →* dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::T*>(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>([S*]) →* dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>({value: S*}) →* dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+static method GenericExtension|get#invocations<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T%> #this) → <S extends self::GenericExtension|get#invocations::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#invocations::T% = dynamic>(S% value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T%, S%>(#this, value);
+static method GenericExtension|tearOffs<T extends core::Object? = dynamic, S extends self::GenericExtension|tearOffs::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T%> #this, self::GenericExtension|tearOffs::S% value) → dynamic {
+  () → self::GenericExtension|tearOffs::T? tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNoArgs(){() → self::GenericExtension|tearOffs::T?};
+  (self::GenericExtension|tearOffs::T%) → dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffRequired(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  ([self::GenericExtension|tearOffs::T?]) → dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffOptional(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  tearOffOptional(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  ({value: self::GenericExtension|tearOffs::T?}) → dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNamed(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>(S%) → dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::T%>(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>([S?]) → dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>({value: S?}) → dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
 }
-static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
-static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic {
-  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value: value);
+static method GenericExtension|get#tearOffs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T%> #this) → <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S% value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T%, S%>(#this, value);
+static method GenericExtension|getterCalls<T extends core::Object? = dynamic, S extends self::GenericExtension|getterCalls::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T%> #this, self::GenericExtension|getterCalls::S% value) → dynamic {
+  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value: value);
 }
-static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
+static method GenericExtension|get#getterCalls<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T%> #this) → <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S% value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T%, S%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.outline.expect
index c697396..293acc8 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.outline.expect
@@ -1,38 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
   field dynamic field;
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  covariant-by-class field self::GenericClass::T* field;
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::GenericClass::T? field;
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method readGetter = self::Extension|readGetter;
   tearoff readGetter = self::Extension|get#readGetter;
   method writeSetterRequired = self::Extension|writeSetterRequired;
@@ -54,7 +34,7 @@
   tearoff getterCalls = self::Extension|get#getterCalls;
   set property = self::Extension|set#property;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method readGetter = self::GenericExtension|readGetter;
   tearoff readGetter = self::GenericExtension|get#readGetter;
   method writeSetterRequired = self::GenericExtension|writeSetterRequired;
@@ -85,103 +65,103 @@
   tearoff getterCalls = self::GenericExtension|get#getterCalls;
   set property = self::GenericExtension|set#property;
 }
-static method Extension|get#readGetter(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#readGetter(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|readGetter(#this);
-static method Extension|readGetter(lowered final self::Class* #this) → dynamic
+static method Extension|readGetter(lowered final self::Class #this) → dynamic
   ;
-static method Extension|writeSetterRequired(lowered final self::Class* #this, dynamic value) → dynamic
+static method Extension|writeSetterRequired(lowered final self::Class #this, dynamic value) → dynamic
   ;
-static method Extension|get#writeSetterRequired(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#writeSetterRequired(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
-static method Extension|writeSetterOptional(lowered final self::Class* #this, [dynamic value]) → dynamic
+static method Extension|writeSetterOptional(lowered final self::Class #this, [dynamic value]) → dynamic
   ;
-static method Extension|get#writeSetterOptional(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#writeSetterOptional(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic value]) → dynamic => self::Extension|writeSetterOptional(#this, value);
-static method Extension|writeSetterNamed(lowered final self::Class* #this, {dynamic value}) → dynamic
+static method Extension|writeSetterNamed(lowered final self::Class #this, {dynamic value}) → dynamic
   ;
-static method Extension|get#writeSetterNamed(lowered final self::Class* #this) → ({value: dynamic}) →* dynamic
+static method Extension|get#writeSetterNamed(lowered final self::Class #this) → ({value: dynamic}) → dynamic
   return ({dynamic value}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
-static method Extension|get#tearOffGetterNoArgs(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNoArgs(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#tearOffGetterRequired(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterRequired(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#tearOffGetterOptional(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterOptional(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#tearOffGetterNamed(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNamed(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#property(lowered final self::Class* #this) → dynamic
+static method Extension|get#property(lowered final self::Class #this) → dynamic
   ;
-static method Extension|set#property(lowered final self::Class* #this, dynamic value) → void
+static method Extension|set#property(lowered final self::Class #this, dynamic value) → void
   ;
-static method Extension|invocations(lowered final self::Class* #this, dynamic value) → dynamic
+static method Extension|invocations(lowered final self::Class #this, dynamic value) → dynamic
   ;
-static method Extension|get#invocations(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#invocations(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
-static method Extension|get#tearOffs(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#tearOffs(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
-static method Extension|tearOffs(lowered final self::Class* #this, dynamic value) → dynamic
+static method Extension|tearOffs(lowered final self::Class #this, dynamic value) → dynamic
   ;
-static method Extension|getterCalls(lowered final self::Class* #this, dynamic value) → dynamic
+static method Extension|getterCalls(lowered final self::Class #this, dynamic value) → dynamic
   ;
-static method Extension|get#getterCalls(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#getterCalls(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
-static method GenericExtension|readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T*
+static method GenericExtension|readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T%> #this) → self::GenericExtension|readGetter::T?
   ;
-static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
-  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
-static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic
+static method GenericExtension|get#readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T%> #this) → () → self::GenericExtension|get#readGetter::T?
+  return () → self::GenericExtension|get#readGetter::T? => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T%>(#this);
+static method GenericExtension|writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T%> #this, self::GenericExtension|writeSetterRequired::T% value) → dynamic
   ;
-static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
-  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
-static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value]) → dynamic
+static method GenericExtension|get#writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T%> #this) → (self::GenericExtension|get#writeSetterRequired::T%) → dynamic
+  return (self::GenericExtension|get#writeSetterRequired::T% value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T%>(#this, value);
+static method GenericExtension|writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T%> #this, [self::GenericExtension|writeSetterOptional::T? value]) → dynamic
   ;
-static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
-  return ([self::GenericExtension|get#writeSetterOptional::T* value]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
-static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value}) → dynamic
+static method GenericExtension|get#writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T%> #this) → ([self::GenericExtension|get#writeSetterOptional::T?]) → dynamic
+  return ([self::GenericExtension|get#writeSetterOptional::T? value]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T%>(#this, value);
+static method GenericExtension|writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T%> #this, {self::GenericExtension|writeSetterNamed::T? value}) → dynamic
   ;
-static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
-  return ({self::GenericExtension|get#writeSetterNamed::T* value}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
-static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic
+static method GenericExtension|get#writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T%> #this) → ({value: self::GenericExtension|get#writeSetterNamed::T?}) → dynamic
+  return ({self::GenericExtension|get#writeSetterNamed::T? value}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T%>(#this, value: value);
+static method GenericExtension|genericWriteSetterRequired<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T%> #this, self::GenericExtension|genericWriteSetterRequired::S% value) → dynamic
   ;
-static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
-static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value]) → dynamic
+static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S% value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T%, S%>(#this, value);
+static method GenericExtension|genericWriteSetterOptional<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T%> #this, [self::GenericExtension|genericWriteSetterOptional::S? value]) → dynamic
   ;
-static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
-static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
-static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value}) → dynamic
+static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S?]) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S? value]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T%, S%>(#this, value);
+static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({value: S?}) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({S? value}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T%, S%>(#this, value: value);
+static method GenericExtension|genericWriteSetterNamed<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T%> #this, {self::GenericExtension|genericWriteSetterNamed::S? value}) → dynamic
   ;
-static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
   ;
-static method GenericExtension|set#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void
+static method GenericExtension|set#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T%> #this, self::GenericExtension|set#property::T? value) → void
   ;
-static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T%> #this) → dynamic
   ;
-static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
+static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T%> #this) → dynamic
   ;
-static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic
+static method GenericExtension|invocations<T extends core::Object? = dynamic, S extends self::GenericExtension|invocations::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T%> #this, self::GenericExtension|invocations::S% value) → dynamic
   ;
-static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
-static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic
+static method GenericExtension|get#invocations<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T%> #this) → <S extends self::GenericExtension|get#invocations::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#invocations::T% = dynamic>(S% value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T%, S%>(#this, value);
+static method GenericExtension|tearOffs<T extends core::Object? = dynamic, S extends self::GenericExtension|tearOffs::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T%> #this, self::GenericExtension|tearOffs::S% value) → dynamic
   ;
-static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
-static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic
+static method GenericExtension|get#tearOffs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T%> #this) → <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S% value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T%, S%>(#this, value);
+static method GenericExtension|getterCalls<T extends core::Object? = dynamic, S extends self::GenericExtension|getterCalls::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T%> #this, self::GenericExtension|getterCalls::S% value) → dynamic
   ;
-static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
+static method GenericExtension|get#getterCalls<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T%> #this) → <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S% value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T%, S%>(#this, value);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.transformed.expect
index d892e0f..68d2b7e 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.transformed.expect
@@ -1,40 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  covariant-by-class field self::GenericClass::T* field = null;
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::GenericClass::T? field = null;
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method readGetter = self::Extension|readGetter;
   tearoff readGetter = self::Extension|get#readGetter;
   method writeSetterRequired = self::Extension|writeSetterRequired;
@@ -56,7 +36,7 @@
   tearoff getterCalls = self::Extension|get#getterCalls;
   set property = self::Extension|set#property;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method readGetter = self::GenericExtension|readGetter;
   tearoff readGetter = self::GenericExtension|get#readGetter;
   method writeSetterRequired = self::GenericExtension|writeSetterRequired;
@@ -87,40 +67,40 @@
   tearoff getterCalls = self::GenericExtension|get#getterCalls;
   set property = self::GenericExtension|set#property;
 }
-static method Extension|get#readGetter(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#readGetter(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|readGetter(#this);
-static method Extension|readGetter(lowered final self::Class* #this) → dynamic {
+static method Extension|readGetter(lowered final self::Class #this) → dynamic {
   return self::Extension|get#property(#this);
 }
-static method Extension|writeSetterRequired(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|writeSetterRequired(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterRequired(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#writeSetterRequired(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
-static method Extension|writeSetterOptional(lowered final self::Class* #this, [dynamic value = #C1]) → dynamic {
+static method Extension|writeSetterOptional(lowered final self::Class #this, [dynamic value = #C1]) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterOptional(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+static method Extension|get#writeSetterOptional(lowered final self::Class #this) → ([dynamic]) → dynamic
   return ([dynamic value = #C1]) → dynamic => self::Extension|writeSetterOptional(#this, value);
-static method Extension|writeSetterNamed(lowered final self::Class* #this, {dynamic value = #C1}) → dynamic {
+static method Extension|writeSetterNamed(lowered final self::Class #this, {dynamic value = #C1}) → dynamic {
   self::Extension|set#property(#this, value);
 }
-static method Extension|get#writeSetterNamed(lowered final self::Class* #this) → ({value: dynamic}) →* dynamic
+static method Extension|get#writeSetterNamed(lowered final self::Class #this) → ({value: dynamic}) → dynamic
   return ({dynamic value = #C1}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
-static method Extension|get#tearOffGetterNoArgs(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNoArgs(lowered final self::Class #this) → dynamic
   return self::Extension|get#readGetter(#this);
-static method Extension|get#tearOffGetterRequired(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterRequired(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterRequired(#this);
-static method Extension|get#tearOffGetterOptional(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterOptional(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterOptional(#this);
-static method Extension|get#tearOffGetterNamed(lowered final self::Class* #this) → dynamic
+static method Extension|get#tearOffGetterNamed(lowered final self::Class #this) → dynamic
   return self::Extension|get#writeSetterNamed(#this);
-static method Extension|get#property(lowered final self::Class* #this) → dynamic
+static method Extension|get#property(lowered final self::Class #this) → dynamic
   return #this.{self::Class::field}{dynamic};
-static method Extension|set#property(lowered final self::Class* #this, dynamic value) → void {
+static method Extension|set#property(lowered final self::Class #this, dynamic value) → void {
   #this.{self::Class::field} = value;
 }
-static method Extension|invocations(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|invocations(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|readGetter(#this);
   self::Extension|writeSetterRequired(#this, value);
   self::Extension|writeSetterOptional(#this);
@@ -128,23 +108,23 @@
   self::Extension|writeSetterNamed(#this);
   self::Extension|writeSetterNamed(#this, value: value);
 }
-static method Extension|get#invocations(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#invocations(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
-static method Extension|get#tearOffs(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#tearOffs(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
-static method Extension|tearOffs(lowered final self::Class* #this, dynamic value) → dynamic {
-  () →* dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+static method Extension|tearOffs(lowered final self::Class #this, dynamic value) → dynamic {
+  () → dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
 }
-static method Extension|getterCalls(lowered final self::Class* #this, dynamic value) → dynamic {
+static method Extension|getterCalls(lowered final self::Class #this, dynamic value) → dynamic {
   self::Extension|get#tearOffGetterNoArgs(#this){dynamic}.call();
   self::Extension|get#tearOffGetterRequired(#this){dynamic}.call(value);
   self::Extension|get#tearOffGetterOptional(#this){dynamic}.call();
@@ -152,144 +132,144 @@
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call();
   self::Extension|get#tearOffGetterNamed(#this){dynamic}.call(value: value);
 }
-static method Extension|get#getterCalls(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#getterCalls(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
-static method GenericExtension|readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T* {
-  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T*>(#this);
+static method GenericExtension|readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T%> #this) → self::GenericExtension|readGetter::T? {
+  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T%>(#this);
 }
-static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
-  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
-static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T*>(#this, value);
+static method GenericExtension|get#readGetter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T%> #this) → () → self::GenericExtension|get#readGetter::T?
+  return () → self::GenericExtension|get#readGetter::T? => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T%>(#this);
+static method GenericExtension|writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T%> #this, self::GenericExtension|writeSetterRequired::T% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
-  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
-static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T*>(#this, value);
+static method GenericExtension|get#writeSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T%> #this) → (self::GenericExtension|get#writeSetterRequired::T%) → dynamic
+  return (self::GenericExtension|get#writeSetterRequired::T% value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T%>(#this, value);
+static method GenericExtension|writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T%> #this, [self::GenericExtension|writeSetterOptional::T? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
-  return ([self::GenericExtension|get#writeSetterOptional::T* value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
-static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T*>(#this, value);
+static method GenericExtension|get#writeSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T%> #this) → ([self::GenericExtension|get#writeSetterOptional::T?]) → dynamic
+  return ([self::GenericExtension|get#writeSetterOptional::T? value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T%>(#this, value);
+static method GenericExtension|writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T%> #this, {self::GenericExtension|writeSetterNamed::T? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
-  return ({self::GenericExtension|get#writeSetterNamed::T* value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
-static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T*>(#this, value);
+static method GenericExtension|get#writeSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T%> #this) → ({value: self::GenericExtension|get#writeSetterNamed::T?}) → dynamic
+  return ({self::GenericExtension|get#writeSetterNamed::T? value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T%>(#this, value: value);
+static method GenericExtension|genericWriteSetterRequired<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T%> #this, self::GenericExtension|genericWriteSetterRequired::S% value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
-static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T% = dynamic>(S% value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T%, S%>(#this, value);
+static method GenericExtension|genericWriteSetterOptional<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T%> #this, [self::GenericExtension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T%>(#this, value);
 }
-static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
-static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
-  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
-static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
-  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T*>(#this, value);
+static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S?]) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T% = dynamic>([S? value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T%, S%>(#this, value);
+static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T%> #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({value: S?}) → dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T% = dynamic>({S? value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T%, S%>(#this, value: value);
+static method GenericExtension|genericWriteSetterNamed<T extends core::Object? = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T%> #this, {self::GenericExtension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T%>(#this, value);
 }
-static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
-  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T*};
-static method GenericExtension|set#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T?};
+static method GenericExtension|set#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T%> #this, self::GenericExtension|set#property::T? value) → void {
   #this.{self::GenericClass::field} = value;
 }
-static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
-  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);
-static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T*>(#this);
-static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
-  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T*>(#this);
-static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic {
-  self::GenericExtension|readGetter<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
-  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value: value);
-  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
+static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T%> #this) → dynamic
+  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T%>(#this);
+static method GenericExtension|get#tearOffGetterRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T%>(#this);
+static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T%> #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T%>(#this);
+static method GenericExtension|invocations<T extends core::Object? = dynamic, S extends self::GenericExtension|invocations::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T%> #this, self::GenericExtension|invocations::S% value) → dynamic {
+  self::GenericExtension|readGetter<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::T%>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T%, self::GenericExtension|invocations::S%>(#this, value: value);
 }
-static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
-static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic {
-  () →* self::GenericExtension|tearOffs::T* tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNoArgs(){() →* self::GenericExtension|tearOffs::T*};
-  (self::GenericExtension|tearOffs::T*) →* dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffRequired(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  ([self::GenericExtension|tearOffs::T*]) →* dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffOptional(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  tearOffOptional(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  ({value: self::GenericExtension|tearOffs::T*}) →* dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  tearOffNamed(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>(S*) →* dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::T*>(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
-  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>([S*]) →* dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
-  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
-  <S extends self::GenericExtension|tearOffs::T* = dynamic>({value: S*}) →* dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
-  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+static method GenericExtension|get#invocations<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T%> #this) → <S extends self::GenericExtension|get#invocations::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#invocations::T% = dynamic>(S% value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T%, S%>(#this, value);
+static method GenericExtension|tearOffs<T extends core::Object? = dynamic, S extends self::GenericExtension|tearOffs::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T%> #this, self::GenericExtension|tearOffs::S% value) → dynamic {
+  () → self::GenericExtension|tearOffs::T? tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNoArgs(){() → self::GenericExtension|tearOffs::T?};
+  (self::GenericExtension|tearOffs::T%) → dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffRequired(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  ([self::GenericExtension|tearOffs::T?]) → dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffOptional(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  tearOffOptional(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  ({value: self::GenericExtension|tearOffs::T?}) → dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  tearOffNamed(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>(S%) → dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::T%>(value){(self::GenericExtension|tearOffs::T%) → dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::S%>(value){(self::GenericExtension|tearOffs::S%) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>([S?]) → dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T%>(value){([self::GenericExtension|tearOffs::T?]) → dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S%>(value){([self::GenericExtension|tearOffs::S?]) → dynamic};
+  <S extends self::GenericExtension|tearOffs::T% = dynamic>({value: S?}) → dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T%>(#this);
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T%>(value: value){({value: self::GenericExtension|tearOffs::T?}) → dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S%>(value: value){({value: self::GenericExtension|tearOffs::S?}) → dynamic};
 }
-static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
-static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic {
-  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
-  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value: value);
-  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value: value);
+static method GenericExtension|get#tearOffs<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T%> #this) → <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#tearOffs::T% = dynamic>(S% value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T%, S%>(#this, value);
+static method GenericExtension|getterCalls<T extends core::Object? = dynamic, S extends self::GenericExtension|getterCalls::T% = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T%> #this, self::GenericExtension|getterCalls::S% value) → dynamic {
+  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::T%>(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T%>(#this){dynamic}.call<self::GenericExtension|getterCalls::S%>(value: value);
 }
-static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
-  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
+static method GenericExtension|get#getterCalls<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T%> #this) → <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S%) → dynamic
+  return <S extends self::GenericExtension|get#getterCalls::T% = dynamic>(S% value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T%, S%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart b/pkg/front_end/testcases/extensions/direct_static_access.dart
index 4529483..4260abf 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class<T> {
   static var field;
 }
@@ -36,11 +36,11 @@
     property = value;
   }
 
-  static genericWriteSetterOptional<S>([S value]) {
+  static genericWriteSetterOptional<S>([S? value]) {
     property = value;
   }
 
-  static genericWriteSetterNamed<S>({S value}) {
+  static genericWriteSetterNamed<S>({S? value}) {
     property = value;
   }
 
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline.expect
index e8420b5..bd96cbe 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T> {
   static var field;
 }
@@ -12,8 +11,8 @@
   static writeSetterOptional([value]) {}
   static writeSetterNamed({value}) {}
   static genericWriteSetterRequired<S>(S value) {}
-  static genericWriteSetterOptional<S>([S value]) {}
-  static genericWriteSetterNamed<S>({S value}) {}
+  static genericWriteSetterOptional<S>([S? value]) {}
+  static genericWriteSetterNamed<S>({S? value}) {}
   static get tearOffGetterNoArgs => readGetter;
   static get tearOffGetterRequired => writeSetterRequired;
   static get tearOffGetterOptional => writeSetterOptional;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline_modelled.expect
index 8fc0c10..b978413 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T> {
   static var field;
 }
@@ -8,8 +7,8 @@
   getterCallsFromInstanceContext(T value) {}
   invocationsFromInstanceContext(T value) {}
   static fieldAccessFromStaticContext() {}
-  static genericWriteSetterNamed<S>({S value}) {}
-  static genericWriteSetterOptional<S>([S value]) {}
+  static genericWriteSetterNamed<S>({S? value}) {}
+  static genericWriteSetterOptional<S>([S? value]) {}
   static genericWriteSetterRequired<S>(S value) {}
   static get property => Class.field;
   static get tearOffGetterGenericNamed => genericWriteSetterNamed;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.expect
index 942973c..cb65d7c 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
+class Class<T extends core::Object? = dynamic> extends core::Object {
   static field dynamic field = null;
-  synthetic constructor •() → self::Class<self::Class::T*>*
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   static get property = get self::Extension|property;
   static field field = self::Extension|field;
   static method readGetter = self::Extension|readGetter;
@@ -67,13 +57,13 @@
 static method Extension|writeSetterNamed({dynamic value = #C1}) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic {
+static method Extension|genericWriteSetterRequired<S extends core::Object? = dynamic>(self::Extension|genericWriteSetterRequired::S% value) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
+static method Extension|genericWriteSetterOptional<S extends core::Object? = dynamic>([self::Extension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
+static method Extension|genericWriteSetterNamed<S extends core::Object? = dynamic>({self::Extension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
   self::Extension|property = value;
 }
 static get Extension|tearOffGetterNoArgs() → dynamic
@@ -90,54 +80,54 @@
   return #C7;
 static get Extension|tearOffGetterGenericNamed() → dynamic
   return #C8;
-static method Extension|invocationsFromStaticContext(core::int* value) → dynamic {
+static method Extension|invocationsFromStaticContext(core::int value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<core::int*>();
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
+  self::Extension|genericWriteSetterOptional<core::int>();
+  self::Extension|genericWriteSetterOptional<core::int>(value);
+  self::Extension|genericWriteSetterOptional<core::int>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<core::int*>();
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>();
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
 }
-static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<core::int*>(){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<core::int*>(){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
+static method Extension|tearOffsFromStaticContext(core::int value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<core::int>(){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<core::int>(){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
 }
 static method Extension|fieldAccessFromStaticContext() → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic {
+static method Extension|getterCallsFromStaticContext(core::int value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -145,70 +135,70 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>(value: value);
 }
-static method Extension|invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T*>* #this, self::Extension|invocationsFromInstanceContext::T* value) → dynamic {
+static method Extension|invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T%> #this, self::Extension|invocationsFromInstanceContext::T% value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T*>* #this) → (self::Extension|get#invocationsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#invocationsFromInstanceContext::T* value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T*>(#this, value);
-static method Extension|tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T*>* #this, self::Extension|tearOffsFromInstanceContext::T* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+static method Extension|get#invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T%> #this) → (self::Extension|get#invocationsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#invocationsFromInstanceContext::T% value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T%>(#this, value);
+static method Extension|tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T%> #this, self::Extension|tearOffsFromInstanceContext::T% value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
 }
-static method Extension|get#tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T*>* #this) → (self::Extension|get#tearOffsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#tearOffsFromInstanceContext::T* value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T*>(#this, value);
-static method Extension|fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T*>* #this) → dynamic {
+static method Extension|get#tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T%> #this) → (self::Extension|get#tearOffsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#tearOffsFromInstanceContext::T% value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T%>(#this, value);
+static method Extension|fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T%> #this) → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T*>(#this);
-static method Extension|getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T*>* #this, self::Extension|getterCallsFromInstanceContext::T* value) → dynamic {
+static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T%> #this) → () → dynamic
+  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T%>(#this);
+static method Extension|getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T%> #this, self::Extension|getterCallsFromInstanceContext::T% value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -216,18 +206,18 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T*>* #this) → (self::Extension|get#getterCallsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#getterCallsFromInstanceContext::T* value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T*>(#this, value);
+static method Extension|get#getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T%> #this) → (self::Extension|get#getterCallsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#getterCallsFromInstanceContext::T% value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect
index 942973c..cb65d7c 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
+class Class<T extends core::Object? = dynamic> extends core::Object {
   static field dynamic field = null;
-  synthetic constructor •() → self::Class<self::Class::T*>*
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   static get property = get self::Extension|property;
   static field field = self::Extension|field;
   static method readGetter = self::Extension|readGetter;
@@ -67,13 +57,13 @@
 static method Extension|writeSetterNamed({dynamic value = #C1}) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic {
+static method Extension|genericWriteSetterRequired<S extends core::Object? = dynamic>(self::Extension|genericWriteSetterRequired::S% value) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
+static method Extension|genericWriteSetterOptional<S extends core::Object? = dynamic>([self::Extension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
+static method Extension|genericWriteSetterNamed<S extends core::Object? = dynamic>({self::Extension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
   self::Extension|property = value;
 }
 static get Extension|tearOffGetterNoArgs() → dynamic
@@ -90,54 +80,54 @@
   return #C7;
 static get Extension|tearOffGetterGenericNamed() → dynamic
   return #C8;
-static method Extension|invocationsFromStaticContext(core::int* value) → dynamic {
+static method Extension|invocationsFromStaticContext(core::int value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<core::int*>();
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
+  self::Extension|genericWriteSetterOptional<core::int>();
+  self::Extension|genericWriteSetterOptional<core::int>(value);
+  self::Extension|genericWriteSetterOptional<core::int>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<core::int*>();
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>();
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
 }
-static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<core::int*>(){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<core::int*>(){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
+static method Extension|tearOffsFromStaticContext(core::int value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<core::int>(){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<core::int>(){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
 }
 static method Extension|fieldAccessFromStaticContext() → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic {
+static method Extension|getterCallsFromStaticContext(core::int value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -145,70 +135,70 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>(value: value);
 }
-static method Extension|invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T*>* #this, self::Extension|invocationsFromInstanceContext::T* value) → dynamic {
+static method Extension|invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T%> #this, self::Extension|invocationsFromInstanceContext::T% value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T*>* #this) → (self::Extension|get#invocationsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#invocationsFromInstanceContext::T* value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T*>(#this, value);
-static method Extension|tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T*>* #this, self::Extension|tearOffsFromInstanceContext::T* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+static method Extension|get#invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T%> #this) → (self::Extension|get#invocationsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#invocationsFromInstanceContext::T% value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T%>(#this, value);
+static method Extension|tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T%> #this, self::Extension|tearOffsFromInstanceContext::T% value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
 }
-static method Extension|get#tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T*>* #this) → (self::Extension|get#tearOffsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#tearOffsFromInstanceContext::T* value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T*>(#this, value);
-static method Extension|fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T*>* #this) → dynamic {
+static method Extension|get#tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T%> #this) → (self::Extension|get#tearOffsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#tearOffsFromInstanceContext::T% value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T%>(#this, value);
+static method Extension|fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T%> #this) → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T*>(#this);
-static method Extension|getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T*>* #this, self::Extension|getterCallsFromInstanceContext::T* value) → dynamic {
+static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T%> #this) → () → dynamic
+  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T%>(#this);
+static method Extension|getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T%> #this, self::Extension|getterCallsFromInstanceContext::T% value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -216,18 +206,18 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T*>* #this) → (self::Extension|get#getterCallsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#getterCallsFromInstanceContext::T* value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T*>(#this, value);
+static method Extension|get#getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T%> #this) → (self::Extension|get#getterCallsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#getterCallsFromInstanceContext::T% value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.outline.expect
index 4453608..0f7ea93 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.outline.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
+class Class<T extends core::Object? = dynamic> extends core::Object {
   static field dynamic field;
-  synthetic constructor •() → self::Class<self::Class::T*>*
+  synthetic constructor •() → self::Class<self::Class::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   static get property = get self::Extension|property;
   static field field = self::Extension|field;
   static method readGetter = self::Extension|readGetter;
@@ -61,11 +51,11 @@
   ;
 static method Extension|writeSetterNamed({dynamic value}) → dynamic
   ;
-static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic
+static method Extension|genericWriteSetterRequired<S extends core::Object? = dynamic>(self::Extension|genericWriteSetterRequired::S% value) → dynamic
   ;
-static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value]) → dynamic
+static method Extension|genericWriteSetterOptional<S extends core::Object? = dynamic>([self::Extension|genericWriteSetterOptional::S? value]) → dynamic
   ;
-static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value}) → dynamic
+static method Extension|genericWriteSetterNamed<S extends core::Object? = dynamic>({self::Extension|genericWriteSetterNamed::S? value}) → dynamic
   ;
 static get Extension|tearOffGetterNoArgs() → dynamic
   ;
@@ -81,29 +71,29 @@
   ;
 static get Extension|tearOffGetterGenericNamed() → dynamic
   ;
-static method Extension|invocationsFromStaticContext(core::int* value) → dynamic
+static method Extension|invocationsFromStaticContext(core::int value) → dynamic
   ;
-static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic
+static method Extension|tearOffsFromStaticContext(core::int value) → dynamic
   ;
 static method Extension|fieldAccessFromStaticContext() → dynamic
   ;
-static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic
+static method Extension|getterCallsFromStaticContext(core::int value) → dynamic
   ;
-static method Extension|invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T*>* #this, self::Extension|invocationsFromInstanceContext::T* value) → dynamic
+static method Extension|invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T%> #this, self::Extension|invocationsFromInstanceContext::T% value) → dynamic
   ;
-static method Extension|get#invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T*>* #this) → (self::Extension|get#invocationsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#invocationsFromInstanceContext::T* value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T*>(#this, value);
-static method Extension|tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T*>* #this, self::Extension|tearOffsFromInstanceContext::T* value) → dynamic
+static method Extension|get#invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T%> #this) → (self::Extension|get#invocationsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#invocationsFromInstanceContext::T% value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T%>(#this, value);
+static method Extension|tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T%> #this, self::Extension|tearOffsFromInstanceContext::T% value) → dynamic
   ;
-static method Extension|get#tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T*>* #this) → (self::Extension|get#tearOffsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#tearOffsFromInstanceContext::T* value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T*>(#this, value);
-static method Extension|fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T*>* #this) → dynamic
+static method Extension|get#tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T%> #this) → (self::Extension|get#tearOffsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#tearOffsFromInstanceContext::T% value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T%>(#this, value);
+static method Extension|fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T%> #this) → dynamic
   ;
-static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T*>(#this);
-static method Extension|getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T*>* #this, self::Extension|getterCallsFromInstanceContext::T* value) → dynamic
+static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T%> #this) → () → dynamic
+  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T%>(#this);
+static method Extension|getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T%> #this, self::Extension|getterCallsFromInstanceContext::T% value) → dynamic
   ;
-static method Extension|get#getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T*>* #this) → (self::Extension|get#getterCallsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#getterCallsFromInstanceContext::T* value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T*>(#this, value);
+static method Extension|get#getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T%> #this) → (self::Extension|get#getterCallsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#getterCallsFromInstanceContext::T% value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T%>(#this, value);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.transformed.expect
index 942973c..cb65d7c 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.transformed.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
+class Class<T extends core::Object? = dynamic> extends core::Object {
   static field dynamic field = null;
-  synthetic constructor •() → self::Class<self::Class::T*>*
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   static get property = get self::Extension|property;
   static field field = self::Extension|field;
   static method readGetter = self::Extension|readGetter;
@@ -67,13 +57,13 @@
 static method Extension|writeSetterNamed({dynamic value = #C1}) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic {
+static method Extension|genericWriteSetterRequired<S extends core::Object? = dynamic>(self::Extension|genericWriteSetterRequired::S% value) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
+static method Extension|genericWriteSetterOptional<S extends core::Object? = dynamic>([self::Extension|genericWriteSetterOptional::S? value = #C1]) → dynamic {
   self::Extension|property = value;
 }
-static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
+static method Extension|genericWriteSetterNamed<S extends core::Object? = dynamic>({self::Extension|genericWriteSetterNamed::S? value = #C1}) → dynamic {
   self::Extension|property = value;
 }
 static get Extension|tearOffGetterNoArgs() → dynamic
@@ -90,54 +80,54 @@
   return #C7;
 static get Extension|tearOffGetterGenericNamed() → dynamic
   return #C8;
-static method Extension|invocationsFromStaticContext(core::int* value) → dynamic {
+static method Extension|invocationsFromStaticContext(core::int value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
-  self::Extension|genericWriteSetterRequired<core::int*>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
+  self::Extension|genericWriteSetterRequired<core::int>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<core::int*>();
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
-  self::Extension|genericWriteSetterOptional<core::int*>(value);
+  self::Extension|genericWriteSetterOptional<core::int>();
+  self::Extension|genericWriteSetterOptional<core::int>(value);
+  self::Extension|genericWriteSetterOptional<core::int>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<core::int*>();
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
-  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>();
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int>(value: value);
 }
-static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<core::int*>(){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<core::int*>(){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
-  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
+static method Extension|tearOffsFromStaticContext(core::int value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  tearOffGenericRequired<core::int>(value){(core::int) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<core::int>(){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  tearOffGenericOptional<core::int>(value){([core::int?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<core::int>(){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
+  tearOffGenericNamed<core::int>(value: value){({value: core::int?}) → dynamic};
 }
 static method Extension|fieldAccessFromStaticContext() → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic {
+static method Extension|getterCallsFromStaticContext(core::int value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -145,70 +135,70 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int>(value: value);
 }
-static method Extension|invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T*>* #this, self::Extension|invocationsFromInstanceContext::T* value) → dynamic {
+static method Extension|invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T%> #this, self::Extension|invocationsFromInstanceContext::T% value) → dynamic {
   self::Extension|readGetter();
   self::Extension|writeSetterRequired(value);
   self::Extension|writeSetterOptional();
   self::Extension|writeSetterOptional(value);
   self::Extension|writeSetterNamed();
   self::Extension|writeSetterNamed(value: value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterOptional<dynamic>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
-  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T%>(value);
   self::Extension|genericWriteSetterNamed<dynamic>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>();
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
-  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>();
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T*>* #this) → (self::Extension|get#invocationsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#invocationsFromInstanceContext::T* value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T*>(#this, value);
-static method Extension|tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T*>* #this, self::Extension|tearOffsFromInstanceContext::T* value) → dynamic {
-  () →* dynamic tearOffNoArgs = #C2;
-  tearOffNoArgs(){() →* dynamic};
-  (dynamic) →* dynamic tearOffRequired = #C3;
-  tearOffRequired(value){(dynamic) →* dynamic};
-  ([dynamic]) →* dynamic tearOffOptional = #C4;
-  tearOffOptional(){([dynamic]) →* dynamic};
-  tearOffOptional(value){([dynamic]) →* dynamic};
-  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
-  tearOffNamed(){({value: dynamic}) →* dynamic};
-  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
-  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
-  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
-  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
-  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
-  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
-  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+static method Extension|get#invocationsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T%> #this) → (self::Extension|get#invocationsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#invocationsFromInstanceContext::T% value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T%>(#this, value);
+static method Extension|tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T%> #this, self::Extension|tearOffsFromInstanceContext::T% value) → dynamic {
+  () → dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() → dynamic};
+  (dynamic) → dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) → dynamic};
+  ([dynamic]) → dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) → dynamic};
+  tearOffOptional(value){([dynamic]) → dynamic};
+  ({value: dynamic}) → dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) → dynamic};
+  tearOffNamed(value: value){({value: dynamic}) → dynamic};
+  <S extends core::Object? = dynamic>(S%) → dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T%>(value){(self::Extension|tearOffsFromInstanceContext::T%) → dynamic};
+  <S extends core::Object? = dynamic>([S?]) → dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T%>(value){([self::Extension|tearOffsFromInstanceContext::T?]) → dynamic};
+  <S extends core::Object? = dynamic>({value: S?}) → dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T%>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T?}) → dynamic};
 }
-static method Extension|get#tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T*>* #this) → (self::Extension|get#tearOffsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#tearOffsFromInstanceContext::T* value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T*>(#this, value);
-static method Extension|fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T*>* #this) → dynamic {
+static method Extension|get#tearOffsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T%> #this) → (self::Extension|get#tearOffsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#tearOffsFromInstanceContext::T% value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T%>(#this, value);
+static method Extension|fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T%> #this) → dynamic {
   self::Extension|field = self::Extension|property;
   self::Extension|property = self::Extension|field;
 }
-static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T*>(#this);
-static method Extension|getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T*>* #this, self::Extension|getterCallsFromInstanceContext::T* value) → dynamic {
+static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T%> #this) → () → dynamic
+  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T%>(#this);
+static method Extension|getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T%> #this, self::Extension|getterCallsFromInstanceContext::T% value) → dynamic {
   self::Extension|tearOffGetterNoArgs{dynamic}.call();
   self::Extension|tearOffGetterRequired{dynamic}.call(value);
   self::Extension|tearOffGetterOptional{dynamic}.call();
@@ -216,18 +206,18 @@
   self::Extension|tearOffGetterNamed{dynamic}.call();
   self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
   self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericOptional{dynamic}.call();
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
-  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value);
   self::Extension|tearOffGetterGenericNamed{dynamic}.call();
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>();
   self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
-  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T%>(value: value);
 }
-static method Extension|get#getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T*>* #this) → (self::Extension|get#getterCallsFromInstanceContext::T*) →* dynamic
-  return (self::Extension|get#getterCallsFromInstanceContext::T* value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T*>(#this, value);
+static method Extension|get#getterCallsFromInstanceContext<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T%> #this) → (self::Extension|get#getterCallsFromInstanceContext::T%) → dynamic
+  return (self::Extension|get#getterCallsFromInstanceContext::T% value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T%>(#this, value);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart b/pkg/front_end/testcases/extensions/dynamic_invoke.dart
index c449576..bd327b7 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {
   noSuchMethod(Invocation i) => 123;
 }
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline.expect
index de6b9c9..5ee7ab2 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   noSuchMethod(Invocation i) => 123;
 }
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline_modelled.expect
index ab98ca8..df09e5e 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   noSuchMethod(Invocation i) => 123;
 }
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.expect
index 8289cb4..7f2c062 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.expect
@@ -1,24 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation* i) → dynamic
+  method noSuchMethod(core::Invocation i) → dynamic
     return 123;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   method method = self::ClassExtension|method;
   tearoff method = self::ClassExtension|get#method;
 }
@@ -26,24 +17,24 @@
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method ClassExtension|method(lowered final self::Class* #this) → core::int*
+static method ClassExtension|method(lowered final self::Class #this) → core::int
   return 42;
-static method ClassExtension|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::ClassExtension|method(#this);
-static method Extension|method(lowered final dynamic #this) → core::int*
+static method ClassExtension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::ClassExtension|method(#this);
+static method Extension|method(lowered final dynamic #this) → core::int
   return 87;
-static method Extension|get#method(lowered final dynamic #this) → () →* core::int*
-  return () → core::int* => self::Extension|method(#this);
+static method Extension|get#method(lowered final dynamic #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
 static method main() → dynamic {
   dynamic c0 = new self::Class::•();
-  core::Object* c1 = new self::Class::•();
-  self::Class* c2 = new self::Class::•();
+  core::Object c1 = new self::Class::•();
+  self::Class c2 = new self::Class::•();
   self::expect(123, c0{dynamic}.method());
   self::expect(87, self::Extension|method(c1));
   self::expect(42, self::ClassExtension|method(c2));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect
index 8289cb4..7f2c062 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect
@@ -1,24 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation* i) → dynamic
+  method noSuchMethod(core::Invocation i) → dynamic
     return 123;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   method method = self::ClassExtension|method;
   tearoff method = self::ClassExtension|get#method;
 }
@@ -26,24 +17,24 @@
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method ClassExtension|method(lowered final self::Class* #this) → core::int*
+static method ClassExtension|method(lowered final self::Class #this) → core::int
   return 42;
-static method ClassExtension|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::ClassExtension|method(#this);
-static method Extension|method(lowered final dynamic #this) → core::int*
+static method ClassExtension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::ClassExtension|method(#this);
+static method Extension|method(lowered final dynamic #this) → core::int
   return 87;
-static method Extension|get#method(lowered final dynamic #this) → () →* core::int*
-  return () → core::int* => self::Extension|method(#this);
+static method Extension|get#method(lowered final dynamic #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
 static method main() → dynamic {
   dynamic c0 = new self::Class::•();
-  core::Object* c1 = new self::Class::•();
-  self::Class* c2 = new self::Class::•();
+  core::Object c1 = new self::Class::•();
+  self::Class c2 = new self::Class::•();
   self::expect(123, c0{dynamic}.method());
   self::expect(87, self::Extension|method(c1));
   self::expect(42, self::ClassExtension|method(c2));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.outline.expect
index 1f8c07d..c33f586 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.outline.expect
@@ -1,23 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  method noSuchMethod(core::Invocation* i) → dynamic
+  method noSuchMethod(core::Invocation i) → dynamic
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   method method = self::ClassExtension|method;
   tearoff method = self::ClassExtension|get#method;
 }
@@ -25,14 +16,14 @@
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method ClassExtension|method(lowered final self::Class* #this) → core::int*
+static method ClassExtension|method(lowered final self::Class #this) → core::int
   ;
-static method ClassExtension|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::ClassExtension|method(#this);
-static method Extension|method(lowered final dynamic #this) → core::int*
+static method ClassExtension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::ClassExtension|method(#this);
+static method Extension|method(lowered final dynamic #this) → core::int
   ;
-static method Extension|get#method(lowered final dynamic #this) → () →* core::int*
-  return () → core::int* => self::Extension|method(#this);
+static method Extension|get#method(lowered final dynamic #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.transformed.expect
index 8289cb4..7f2c062 100644
--- a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.transformed.expect
@@ -1,24 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation* i) → dynamic
+  method noSuchMethod(core::Invocation i) → dynamic
     return 123;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ClassExtension on self::Class* {
+extension ClassExtension on self::Class {
   method method = self::ClassExtension|method;
   tearoff method = self::ClassExtension|get#method;
 }
@@ -26,24 +17,24 @@
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method ClassExtension|method(lowered final self::Class* #this) → core::int*
+static method ClassExtension|method(lowered final self::Class #this) → core::int
   return 42;
-static method ClassExtension|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::ClassExtension|method(#this);
-static method Extension|method(lowered final dynamic #this) → core::int*
+static method ClassExtension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::ClassExtension|method(#this);
+static method Extension|method(lowered final dynamic #this) → core::int
   return 87;
-static method Extension|get#method(lowered final dynamic #this) → () →* core::int*
-  return () → core::int* => self::Extension|method(#this);
+static method Extension|get#method(lowered final dynamic #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
 static method main() → dynamic {
   dynamic c0 = new self::Class::•();
-  core::Object* c1 = new self::Class::•();
-  self::Class* c2 = new self::Class::•();
+  core::Object c1 = new self::Class::•();
+  self::Class c2 = new self::Class::•();
   self::expect(123, c0{dynamic}.method());
   self::expect(87, self::Extension|method(c1));
   self::expect(42, self::ClassExtension|method(c2));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart b/pkg/front_end/testcases/extensions/explicit_extension_access.dart
index 88b2d04..dc5a1e5 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {
   int field1 = 42;
   int field2 = 87;
@@ -13,7 +13,7 @@
     field1 = value;
   }
   int method() => field1;
-  int genericMethod<T extends num>(T t) => field1 + t;
+  num genericMethod<T extends num>(T t) => field1 + t;
 }
 
 extension Extension2 on Class {
@@ -22,7 +22,7 @@
     field2 = value;
   }
   int method() => field2;
-  int genericMethod<T extends num>(T t) => field2 + t;
+  num genericMethod<T extends num>(T t) => field2 + t;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
index 7d088c6..94ec7bc 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   int field1 = 42;
   int field2 = 87;
@@ -8,14 +7,14 @@
   int get field => field1;
   void set field(int value) {}
   int method() => field1;
-  int genericMethod<T extends num>(T t) => field1 + t;
+  num genericMethod<T extends num>(T t) => field1 + t;
 }
 
 extension Extension2 on Class {
   int get field => field2;
   void set field(int value) {}
   int method() => field2;
-  int genericMethod<T extends num>(T t) => field2 + t;
+  num genericMethod<T extends num>(T t) => field2 + t;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
index 6e3b6e5..a014681 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   int field1 = 42;
   int field2 = 87;
@@ -7,16 +6,16 @@
 expect(expected, actual) {}
 
 extension Extension1 on Class {
-  int genericMethod<T extends num>(T t) => field1 + t;
   int get field => field1;
   int method() => field1;
+  num genericMethod<T extends num>(T t) => field1 + t;
   void set field(int value) {}
 }
 
 extension Extension2 on Class {
-  int genericMethod<T extends num>(T t) => field2 + t;
   int get field => field2;
   int method() => field2;
+  num genericMethod<T extends num>(T t) => field2 + t;
   void set field(int value) {}
 }
 
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
index b2bd40c..4af2463 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field1 = 42;
-  field core::int* field2 = 87;
-  synthetic constructor •() → self::Class*
+  field core::int field1 = 42;
+  field core::int field2 = 87;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
@@ -27,7 +17,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2 on self::Class* {
+extension Extension2 on self::Class {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -35,59 +25,59 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static method Extension1|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field1}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension1|genericMethod::T t) → core::num
+  return #this.{self::Class::field1}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension1|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field2}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension2|genericMethod::T t) → core::num
+  return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
   self::expect(87, self::Extension2|get#field(c));
   self::expect(42, self::Extension1|method(c));
   self::expect(87, self::Extension2|method(c));
-  () →* core::int* tearOff1 = self::Extension1|get#method(c);
-  () →* core::int* tearOff2 = self::Extension2|get#method(c);
-  self::expect(42, tearOff1(){() →* core::int*});
-  self::expect(87, tearOff2(){() →* core::int*});
-  self::expect(52, self::Extension1|genericMethod<core::int*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
-  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
-  self::expect(52, genericTearOff1<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(52, genericTearOff1<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
-  self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
+  () → core::int tearOff1 = self::Extension1|get#method(c);
+  () → core::int tearOff2 = self::Extension2|get#method(c);
+  self::expect(42, tearOff1(){() → core::int});
+  self::expect(87, tearOff2(){() → core::int});
+  self::expect(52, self::Extension1|genericMethod<core::int>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num>(c, 10));
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num>(T) → core::num genericTearOff2 = self::Extension2|get#genericMethod(c);
+  self::expect(52, genericTearOff1<core::int>(10){(core::int) → core::num});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOff1<core::num>(10){(core::num) → core::num});
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
+  self::expect(67, let final self::Class #t4 = c in let final core::int #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
   self::expect(23, self::Extension1|get#field(c));
   self::expect(67, self::Extension2|get#field(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect
index b2bd40c..4af2463 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field1 = 42;
-  field core::int* field2 = 87;
-  synthetic constructor •() → self::Class*
+  field core::int field1 = 42;
+  field core::int field2 = 87;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
@@ -27,7 +17,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2 on self::Class* {
+extension Extension2 on self::Class {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -35,59 +25,59 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static method Extension1|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field1}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension1|genericMethod::T t) → core::num
+  return #this.{self::Class::field1}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension1|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field2}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension2|genericMethod::T t) → core::num
+  return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
   self::expect(87, self::Extension2|get#field(c));
   self::expect(42, self::Extension1|method(c));
   self::expect(87, self::Extension2|method(c));
-  () →* core::int* tearOff1 = self::Extension1|get#method(c);
-  () →* core::int* tearOff2 = self::Extension2|get#method(c);
-  self::expect(42, tearOff1(){() →* core::int*});
-  self::expect(87, tearOff2(){() →* core::int*});
-  self::expect(52, self::Extension1|genericMethod<core::int*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
-  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
-  self::expect(52, genericTearOff1<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(52, genericTearOff1<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
-  self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
+  () → core::int tearOff1 = self::Extension1|get#method(c);
+  () → core::int tearOff2 = self::Extension2|get#method(c);
+  self::expect(42, tearOff1(){() → core::int});
+  self::expect(87, tearOff2(){() → core::int});
+  self::expect(52, self::Extension1|genericMethod<core::int>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num>(c, 10));
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num>(T) → core::num genericTearOff2 = self::Extension2|get#genericMethod(c);
+  self::expect(52, genericTearOff1<core::int>(10){(core::int) → core::num});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOff1<core::num>(10){(core::num) → core::num});
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
+  self::expect(67, let final self::Class #t4 = c in let final core::int #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
   self::expect(23, self::Extension1|get#field(c));
   self::expect(67, self::Extension2|get#field(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
index a5c90f6..28875a9 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field1;
-  field core::int* field2;
-  synthetic constructor •() → self::Class*
+  field core::int field1;
+  field core::int field2;
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
@@ -26,7 +16,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2 on self::Class* {
+extension Extension2 on self::Class {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -34,30 +24,30 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static method Extension1|get#field(lowered final self::Class* #this) → core::int*
+static method Extension1|get#field(lowered final self::Class #this) → core::int
   ;
-static method Extension1|set#field(lowered final self::Class* #this, core::int* value) → void
+static method Extension1|set#field(lowered final self::Class #this, core::int value) → void
   ;
-static method Extension1|method(lowered final self::Class* #this) → core::int*
+static method Extension1|method(lowered final self::Class #this) → core::int
   ;
-static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension1|genericMethod::T t) → core::num
   ;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|get#field(lowered final self::Class* #this) → core::int*
+static method Extension1|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|get#field(lowered final self::Class #this) → core::int
   ;
-static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void
+static method Extension2|set#field(lowered final self::Class #this, core::int value) → void
   ;
-static method Extension2|method(lowered final self::Class* #this) → core::int*
+static method Extension2|method(lowered final self::Class #this) → core::int
   ;
-static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension2|genericMethod::T t) → core::num
   ;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
index 5beead8..aac476a 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field1 = 42;
-  field core::int* field2 = 87;
-  synthetic constructor •() → self::Class*
+  field core::int field1 = 42;
+  field core::int field2 = 87;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
@@ -27,7 +17,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2 on self::Class* {
+extension Extension2 on self::Class {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -35,59 +25,59 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static method Extension1|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field1}{core::int*};
-static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field1}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|get#field(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
+static method Extension1|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field1}{core::int};
+static method Extension1|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension1|genericMethod::T t) → core::num
+  return #this.{self::Class::field1}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension1|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|get#field(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|set#field(lowered final self::Class #this, core::int value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field2}{core::int*};
-static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
-  return #this.{self::Class::field2}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field2}{core::int};
+static method Extension2|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class #this, self::Extension2|genericMethod::T t) → core::num
+  return #this.{self::Class::field2}{core::int}.{core::num::+}(t){(core::num) → core::num};
+static method Extension2|get#genericMethod(lowered final self::Class #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
   self::expect(87, self::Extension2|get#field(c));
   self::expect(42, self::Extension1|method(c));
   self::expect(87, self::Extension2|method(c));
-  () →* core::int* tearOff1 = self::Extension1|get#method(c);
-  () →* core::int* tearOff2 = self::Extension2|get#method(c);
-  self::expect(42, tearOff1(){() →* core::int*});
-  self::expect(87, tearOff2(){() →* core::int*});
-  self::expect(52, self::Extension1|genericMethod<core::int*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
-  self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
-  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
-  self::expect(52, genericTearOff1<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::int*});
-  self::expect(52, genericTearOff1<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::int*});
-  self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
-  self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
+  () → core::int tearOff1 = self::Extension1|get#method(c);
+  () → core::int tearOff2 = self::Extension2|get#method(c);
+  self::expect(42, tearOff1(){() → core::int});
+  self::expect(87, tearOff2(){() → core::int});
+  self::expect(52, self::Extension1|genericMethod<core::int>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num>(c, 10));
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num>(T) → core::num genericTearOff2 = self::Extension2|get#genericMethod(c);
+  self::expect(52, genericTearOff1<core::int>(10){(core::int) → core::num});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOff1<core::num>(10){(core::num) → core::num});
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
+  self::expect(67, let final self::Class #t4 = c in let final core::int #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
   self::expect(23, self::Extension1|get#field(c));
   self::expect(67, self::Extension2|get#field(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
@@ -98,4 +88,4 @@
 Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
 Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
 Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
-Extra constant evaluation: evaluated: 121, effectively constant: 4
+Extra constant evaluation: evaluated: 119, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference.dart b/pkg/front_end/testcases/extensions/explicit_extension_inference.dart
index a8ea3d7..55b65e2 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_inference.dart
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class A {}
 class B extends A {}
 class C extends B {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart
new file mode 100644
index 0000000..cf078bd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T>? {
+  T? get property => null;
+
+  T? method(T? t) => null;
+
+  S? genericMethod1<S>(S? s) => null;
+}
+
+main() {
+  A? aVariable;
+  B? bVariable;
+  C? cVariable;
+
+  GenericClass<A> aClass = new GenericClass<A>();
+  GenericClass<B> bClass = new GenericClass<B>();
+  GenericClass<C> cClass = new GenericClass<C>();
+
+  aVariable = GenericExtension(aClass).property;
+  aVariable = GenericExtension<A>(aClass).property;
+
+  bVariable = GenericExtension(bClass).property;
+  aVariable = GenericExtension<A>(bClass).property;
+  bVariable = GenericExtension<B>(bClass).property;
+
+  cVariable = GenericExtension(cClass).property;
+  aVariable = GenericExtension<A>(cClass).property;
+  bVariable = GenericExtension<B>(cClass).property;
+  cVariable = GenericExtension<C>(cClass).property;
+
+  aVariable = GenericExtension(aClass).method(aVariable);
+  aVariable = GenericExtension<A>(aClass).method(aVariable);
+
+  bVariable = GenericExtension(bClass).method(bVariable);
+  aVariable = GenericExtension<A>(bClass).method(aVariable);
+  bVariable = GenericExtension<B>(bClass).method(bVariable);
+
+  cVariable = GenericExtension(cClass).method(cVariable);
+  aVariable = GenericExtension<A>(cClass).method(aVariable);
+  bVariable = GenericExtension<B>(cClass).method(bVariable);
+  cVariable = GenericExtension<C>(cClass).method(cVariable);
+
+  cVariable = GenericExtension(aClass).genericMethod1(cVariable);
+  aVariable = GenericExtension(aClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension(aClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension(aClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<A>(aClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<A>(aClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<A>(aClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<A>(aClass).genericMethod1<C>(cVariable);
+
+  cVariable = GenericExtension(bClass).genericMethod1(cVariable);
+  aVariable = GenericExtension(bClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension(bClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension(bClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<A>(bClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<A>(bClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<A>(bClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<A>(bClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<B>(bClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<B>(bClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<B>(bClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<B>(bClass).genericMethod1<C>(cVariable);
+
+  cVariable = GenericExtension(cClass).genericMethod1(cVariable);
+  aVariable = GenericExtension(cClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension(cClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension(cClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<A>(cClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<A>(cClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<A>(cClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<A>(cClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<B>(cClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<B>(cClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<B>(cClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<B>(cClass).genericMethod1<C>(cVariable);
+  cVariable = GenericExtension<C>(cClass).genericMethod1(cVariable);
+  aVariable = GenericExtension<C>(cClass).genericMethod1<A>(cVariable);
+  bVariable = GenericExtension<C>(cClass).genericMethod1<B>(cVariable);
+  cVariable = GenericExtension<C>(cClass).genericMethod1<C>(cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline.expect
new file mode 100644
index 0000000..3b9c293
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T>? {
+  T? get property => null;
+  T? method(T? t) => null;
+  S? genericMethod1<S>(S? s) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0afc203
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T>? {
+  S? genericMethod1<S>(S? s) => null;
+  T? get property => null;
+  T? method(T? t) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.expect
new file mode 100644
index 0000000..88c6eb7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%>? {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%>? #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%>? #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%>? #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%>? #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%>? #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  aVariable = self::GenericExtension|get#property<self::A>(bClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|get#property<self::A>(cClass);
+  bVariable = self::GenericExtension|get#property<self::B>(cClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  aVariable = self::GenericExtension|method<self::A>(bClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|method<self::A>(cClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(cClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.modular.expect
new file mode 100644
index 0000000..88c6eb7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.modular.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%>? {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%>? #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%>? #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%>? #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%>? #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%>? #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  aVariable = self::GenericExtension|get#property<self::A>(bClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|get#property<self::A>(cClass);
+  bVariable = self::GenericExtension|get#property<self::B>(cClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  aVariable = self::GenericExtension|method<self::A>(bClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|method<self::A>(cClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(cClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.outline.expect
new file mode 100644
index 0000000..056d4a3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.outline.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%>? {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%>? #this) → self::GenericExtension|get#property::T?
+  ;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%>? #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  ;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%>? #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%>? #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  ;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%>? #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.transformed.expect
new file mode 100644
index 0000000..88c6eb7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference2.dart.weak.transformed.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%>? {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%>? #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%>? #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%>? #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%>? #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%>? #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  aVariable = self::GenericExtension|get#property<self::A>(bClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|get#property<self::A>(cClass);
+  bVariable = self::GenericExtension|get#property<self::B>(cClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  aVariable = self::GenericExtension|method<self::A>(bClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|method<self::A>(cClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(cClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart
index 7cde52c..3cc9224 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class<T extends num> {
   T field1;
   T field2;
@@ -10,7 +10,7 @@
 }
 
 extension Extension1<T extends num> on Class<T> {
-  static String latestType;
+  static String? latestType;
   T get field {
     latestType = '$T';
     return field1;
@@ -25,7 +25,7 @@
   }
   T genericMethod<S extends num>(S t) {
     latestType = '$T:$S';
-    return field1 + t;
+    return (field1 + t) as T;
   }
 }
 
@@ -35,7 +35,7 @@
     field2 = value;
   }
   T method() => field2;
-  T genericMethod<S extends num>(S t) => field2 + t;
+  T genericMethod<S extends num>(S t) => (field2 + t) as T;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline.expect
index 90dcfe1..f7cbe30 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T extends num> {
   T field1;
   T field2;
@@ -6,7 +5,7 @@
 }
 
 extension Extension1<T extends num> on Class<T> {
-  static String latestType;
+  static String? latestType;
   T get field {}
   void set field(T value) {}
   T method() {}
@@ -17,7 +16,7 @@
   T get field => field2;
   void set field(T value) {}
   T method() => field2;
-  T genericMethod<S extends num>(S t) => field2 + t;
+  T genericMethod<S extends num>(S t) => (field2 + t) as T;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline_modelled.expect
index 11d1037..69276f1 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T extends num> {
   Class(this.field1, this.field2);
   T field1;
@@ -11,12 +10,12 @@
   T genericMethod<S extends num>(S t) {}
   T get field {}
   T method() {}
-  static String latestType;
+  static String? latestType;
   void set field(T value) {}
 }
 
 extension Extension2<T extends num> on Class<T> {
-  T genericMethod<S extends num>(S t) => field2 + t;
+  T genericMethod<S extends num>(S t) => (field2 + t) as T;
   T get field => field2;
   T method() => field2;
   void set field(T value) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
index ad69a00..44f1f384 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num*> extends core::Object {
-  covariant-by-class field self::Class::T* field1;
-  covariant-by-class field self::Class::T* field2;
-  constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
+class Class<T extends core::num> extends core::Object {
+  covariant-by-class field self::Class::T field1;
+  covariant-by-class field self::Class::T field2;
+  constructor •(self::Class::T field1, self::Class::T field2) → self::Class<self::Class::T>
     : self::Class::field1 = field1, self::Class::field2 = field2, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num> on self::Class<T> {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -28,7 +18,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num> on self::Class<T> {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -36,99 +26,99 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
-  self::Extension1|latestType = "${self::Extension1|get#field::T*}";
-  return #this.{self::Class::field1}{self::Extension1|get#field::T*};
+static field core::String? Extension1|latestType;
+static method Extension1|get#field<T extends core::num>(lowered final self::Class<self::Extension1|get#field::T> #this) → self::Extension1|get#field::T {
+  self::Extension1|latestType = "${self::Extension1|get#field::T}";
+  return #this.{self::Class::field1}{self::Extension1|get#field::T};
 }
-static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
-  self::Extension1|latestType = "${self::Extension1|set#field::T*}";
+static method Extension1|set#field<T extends core::num>(lowered final self::Class<self::Extension1|set#field::T> #this, self::Extension1|set#field::T value) → void {
+  self::Extension1|latestType = "${self::Extension1|set#field::T}";
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
-  self::Extension1|latestType = "${self::Extension1|method::T*}";
-  return #this.{self::Class::field1}{self::Extension1|method::T*};
+static method Extension1|method<T extends core::num>(lowered final self::Class<self::Extension1|method::T> #this) → self::Extension1|method::T {
+  self::Extension1|latestType = "${self::Extension1|method::T}";
+  return #this.{self::Class::field1}{self::Extension1|method::T};
 }
-static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
-  return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
-  self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
-  return #this.{self::Class::field1}{self::Extension1|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension1|genericMethod::T*;
+static method Extension1|get#method<T extends core::num>(lowered final self::Class<self::Extension1|get#method::T> #this) → () → self::Extension1|get#method::T
+  return () → self::Extension1|get#method::T => self::Extension1|method<self::Extension1|get#method::T>(#this);
+static method Extension1|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension1|genericMethod::T> #this, self::Extension1|genericMethod::S t) → self::Extension1|genericMethod::T {
+  self::Extension1|latestType = "${self::Extension1|genericMethod::T}:${self::Extension1|genericMethod::S}";
+  return #this.{self::Class::field1}{self::Extension1|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension1|genericMethod::T;
 }
-static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
-  return #this.{self::Class::field2}{self::Extension2|get#field::T*};
-static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+static method Extension1|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension1|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension1|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension1|get#genericMethod::T => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T, S>(#this, t);
+static method Extension2|get#field<T extends core::num>(lowered final self::Class<self::Extension2|get#field::T> #this) → self::Extension2|get#field::T
+  return #this.{self::Class::field2}{self::Extension2|get#field::T};
+static method Extension2|set#field<T extends core::num>(lowered final self::Class<self::Extension2|set#field::T> #this, self::Extension2|set#field::T value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
-  return #this.{self::Class::field2}{self::Extension2|method::T*};
-static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
-  return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
-  return #this.{self::Class::field2}{self::Extension2|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension2|genericMethod::T*;
-static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|method<T extends core::num>(lowered final self::Class<self::Extension2|method::T> #this) → self::Extension2|method::T
+  return #this.{self::Class::field2}{self::Extension2|method::T};
+static method Extension2|get#method<T extends core::num>(lowered final self::Class<self::Extension2|get#method::T> #this) → () → self::Extension2|get#method::T
+  return () → self::Extension2|get#method::T => self::Extension2|method<self::Extension2|get#method::T>(#this);
+static method Extension2|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension2|genericMethod::T> #this, self::Extension2|genericMethod::S t) → self::Extension2|genericMethod::T
+  return #this.{self::Class::field2}{self::Extension2|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension2|genericMethod::T;
+static method Extension2|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension2|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension2|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension2|get#genericMethod::T => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T, S>(#this, t);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
-  self::expect(42, self::Extension1|get#field<core::num*>(c));
+  self::Class<core::int> c = new self::Class::•<core::int>(42, 87);
+  self::expect(42, self::Extension1|get#field<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|get#field<core::int*>(c));
+  self::expect(42, self::Extension1|get#field<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|get#field<core::num*>(c));
-  self::expect(42, self::Extension1|method<core::num*>(c));
+  self::expect(87, self::Extension2|get#field<core::num>(c));
+  self::expect(42, self::Extension1|method<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|method<core::int*>(c));
+  self::expect(42, self::Extension1|method<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|method<core::num*>(c));
-  () →* core::num* tearOffNumber1 = self::Extension1|get#method<core::num*>(c);
-  () →* core::int* tearOffInteger1 = self::Extension1|get#method<core::int*>(c);
-  () →* core::num* tearOff2 = self::Extension2|get#method<core::num*>(c);
-  self::expect(42, tearOffNumber1(){() →* core::num*});
+  self::expect(87, self::Extension2|method<core::num>(c));
+  () → core::num tearOffNumber1 = self::Extension1|get#method<core::num>(c);
+  () → core::int tearOffInteger1 = self::Extension1|get#method<core::int>(c);
+  () → core::num tearOff2 = self::Extension2|get#method<core::num>(c);
+  self::expect(42, tearOffNumber1(){() → core::num});
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, tearOffInteger1(){() →* core::int*});
+  self::expect(42, tearOffInteger1(){() → core::int});
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, tearOff2(){() →* core::num*});
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::int*>(c, 10));
+  self::expect(87, tearOff2(){() → core::num});
+  self::expect(52, self::Extension1|genericMethod<core::num, core::int>(c, 10));
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::num*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num, core::num>(c, 10));
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::num*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::num>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
-  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
-  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
-  self::expect(52, genericTearOffNumber1<core::int*>(10){(core::int*) →* core::num*});
+  <S extends core::num>(S) → core::num genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num>(c);
+  <S extends core::num>(S) → core::int genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int>(c);
+  <S extends core::num>(S) → core::num genericTearOff2 = self::Extension2|get#genericMethod<core::num>(c);
+  self::expect(52, genericTearOffNumber1<core::int>(10){(core::int) → core::num});
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::int*>(10){(core::int*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::int>(10){(core::int) → core::int});
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::num*});
-  self::expect(52, genericTearOffNumber1<core::num*>(10){(core::num*) →* core::num*});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOffNumber1<core::num>(10){(core::num) → core::num});
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::num*>(10){(core::num*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::num>(10){(core::num) → core::int});
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::num*});
-  self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class<core::int> #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num>(#t1, #t2) in #t2);
   self::expect("num", self::Extension1|latestType);
-  self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
+  self::expect(23, let final self::Class<core::int> #t4 = c in let final core::int #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int>(#t4, #t5) in #t5);
   self::expect("int", self::Extension1|latestType);
-  self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
-  self::expect(23, self::Extension1|get#field<core::num*>(c));
-  self::expect(67, self::Extension2|get#field<core::num*>(c));
+  self::expect(67, let final self::Class<core::int> #t7 = c in let final core::int #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num>(#t7, #t8) in #t8);
+  self::expect(23, self::Extension1|get#field<core::num>(c));
+  self::expect(67, self::Extension2|get#field<core::num>(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect
index ad69a00..44f1f384 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num*> extends core::Object {
-  covariant-by-class field self::Class::T* field1;
-  covariant-by-class field self::Class::T* field2;
-  constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
+class Class<T extends core::num> extends core::Object {
+  covariant-by-class field self::Class::T field1;
+  covariant-by-class field self::Class::T field2;
+  constructor •(self::Class::T field1, self::Class::T field2) → self::Class<self::Class::T>
     : self::Class::field1 = field1, self::Class::field2 = field2, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num> on self::Class<T> {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -28,7 +18,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num> on self::Class<T> {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -36,99 +26,99 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
-  self::Extension1|latestType = "${self::Extension1|get#field::T*}";
-  return #this.{self::Class::field1}{self::Extension1|get#field::T*};
+static field core::String? Extension1|latestType;
+static method Extension1|get#field<T extends core::num>(lowered final self::Class<self::Extension1|get#field::T> #this) → self::Extension1|get#field::T {
+  self::Extension1|latestType = "${self::Extension1|get#field::T}";
+  return #this.{self::Class::field1}{self::Extension1|get#field::T};
 }
-static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
-  self::Extension1|latestType = "${self::Extension1|set#field::T*}";
+static method Extension1|set#field<T extends core::num>(lowered final self::Class<self::Extension1|set#field::T> #this, self::Extension1|set#field::T value) → void {
+  self::Extension1|latestType = "${self::Extension1|set#field::T}";
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
-  self::Extension1|latestType = "${self::Extension1|method::T*}";
-  return #this.{self::Class::field1}{self::Extension1|method::T*};
+static method Extension1|method<T extends core::num>(lowered final self::Class<self::Extension1|method::T> #this) → self::Extension1|method::T {
+  self::Extension1|latestType = "${self::Extension1|method::T}";
+  return #this.{self::Class::field1}{self::Extension1|method::T};
 }
-static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
-  return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
-  self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
-  return #this.{self::Class::field1}{self::Extension1|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension1|genericMethod::T*;
+static method Extension1|get#method<T extends core::num>(lowered final self::Class<self::Extension1|get#method::T> #this) → () → self::Extension1|get#method::T
+  return () → self::Extension1|get#method::T => self::Extension1|method<self::Extension1|get#method::T>(#this);
+static method Extension1|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension1|genericMethod::T> #this, self::Extension1|genericMethod::S t) → self::Extension1|genericMethod::T {
+  self::Extension1|latestType = "${self::Extension1|genericMethod::T}:${self::Extension1|genericMethod::S}";
+  return #this.{self::Class::field1}{self::Extension1|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension1|genericMethod::T;
 }
-static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
-  return #this.{self::Class::field2}{self::Extension2|get#field::T*};
-static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+static method Extension1|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension1|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension1|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension1|get#genericMethod::T => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T, S>(#this, t);
+static method Extension2|get#field<T extends core::num>(lowered final self::Class<self::Extension2|get#field::T> #this) → self::Extension2|get#field::T
+  return #this.{self::Class::field2}{self::Extension2|get#field::T};
+static method Extension2|set#field<T extends core::num>(lowered final self::Class<self::Extension2|set#field::T> #this, self::Extension2|set#field::T value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
-  return #this.{self::Class::field2}{self::Extension2|method::T*};
-static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
-  return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
-  return #this.{self::Class::field2}{self::Extension2|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension2|genericMethod::T*;
-static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|method<T extends core::num>(lowered final self::Class<self::Extension2|method::T> #this) → self::Extension2|method::T
+  return #this.{self::Class::field2}{self::Extension2|method::T};
+static method Extension2|get#method<T extends core::num>(lowered final self::Class<self::Extension2|get#method::T> #this) → () → self::Extension2|get#method::T
+  return () → self::Extension2|get#method::T => self::Extension2|method<self::Extension2|get#method::T>(#this);
+static method Extension2|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension2|genericMethod::T> #this, self::Extension2|genericMethod::S t) → self::Extension2|genericMethod::T
+  return #this.{self::Class::field2}{self::Extension2|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension2|genericMethod::T;
+static method Extension2|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension2|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension2|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension2|get#genericMethod::T => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T, S>(#this, t);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
-  self::expect(42, self::Extension1|get#field<core::num*>(c));
+  self::Class<core::int> c = new self::Class::•<core::int>(42, 87);
+  self::expect(42, self::Extension1|get#field<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|get#field<core::int*>(c));
+  self::expect(42, self::Extension1|get#field<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|get#field<core::num*>(c));
-  self::expect(42, self::Extension1|method<core::num*>(c));
+  self::expect(87, self::Extension2|get#field<core::num>(c));
+  self::expect(42, self::Extension1|method<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|method<core::int*>(c));
+  self::expect(42, self::Extension1|method<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|method<core::num*>(c));
-  () →* core::num* tearOffNumber1 = self::Extension1|get#method<core::num*>(c);
-  () →* core::int* tearOffInteger1 = self::Extension1|get#method<core::int*>(c);
-  () →* core::num* tearOff2 = self::Extension2|get#method<core::num*>(c);
-  self::expect(42, tearOffNumber1(){() →* core::num*});
+  self::expect(87, self::Extension2|method<core::num>(c));
+  () → core::num tearOffNumber1 = self::Extension1|get#method<core::num>(c);
+  () → core::int tearOffInteger1 = self::Extension1|get#method<core::int>(c);
+  () → core::num tearOff2 = self::Extension2|get#method<core::num>(c);
+  self::expect(42, tearOffNumber1(){() → core::num});
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, tearOffInteger1(){() →* core::int*});
+  self::expect(42, tearOffInteger1(){() → core::int});
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, tearOff2(){() →* core::num*});
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::int*>(c, 10));
+  self::expect(87, tearOff2(){() → core::num});
+  self::expect(52, self::Extension1|genericMethod<core::num, core::int>(c, 10));
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::num*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num, core::num>(c, 10));
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::num*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::num>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
-  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
-  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
-  self::expect(52, genericTearOffNumber1<core::int*>(10){(core::int*) →* core::num*});
+  <S extends core::num>(S) → core::num genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num>(c);
+  <S extends core::num>(S) → core::int genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int>(c);
+  <S extends core::num>(S) → core::num genericTearOff2 = self::Extension2|get#genericMethod<core::num>(c);
+  self::expect(52, genericTearOffNumber1<core::int>(10){(core::int) → core::num});
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::int*>(10){(core::int*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::int>(10){(core::int) → core::int});
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::num*});
-  self::expect(52, genericTearOffNumber1<core::num*>(10){(core::num*) →* core::num*});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOffNumber1<core::num>(10){(core::num) → core::num});
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::num*>(10){(core::num*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::num>(10){(core::num) → core::int});
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::num*});
-  self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class<core::int> #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num>(#t1, #t2) in #t2);
   self::expect("num", self::Extension1|latestType);
-  self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
+  self::expect(23, let final self::Class<core::int> #t4 = c in let final core::int #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int>(#t4, #t5) in #t5);
   self::expect("int", self::Extension1|latestType);
-  self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
-  self::expect(23, self::Extension1|get#field<core::num*>(c));
-  self::expect(67, self::Extension2|get#field<core::num*>(c));
+  self::expect(67, let final self::Class<core::int> #t7 = c in let final core::int #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num>(#t7, #t8) in #t8);
+  self::expect(23, self::Extension1|get#field<core::num>(c));
+  self::expect(67, self::Extension2|get#field<core::num>(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
index 322d3b1..17ed754 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num*> extends core::Object {
-  covariant-by-class field self::Class::T* field1;
-  covariant-by-class field self::Class::T* field2;
-  constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
+class Class<T extends core::num> extends core::Object {
+  covariant-by-class field self::Class::T field1;
+  covariant-by-class field self::Class::T field2;
+  constructor •(self::Class::T field1, self::Class::T field2) → self::Class<self::Class::T>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num> on self::Class<T> {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -27,7 +17,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num> on self::Class<T> {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -35,31 +25,31 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T*
+static field core::String? Extension1|latestType;
+static method Extension1|get#field<T extends core::num>(lowered final self::Class<self::Extension1|get#field::T> #this) → self::Extension1|get#field::T
   ;
-static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void
+static method Extension1|set#field<T extends core::num>(lowered final self::Class<self::Extension1|set#field::T> #this, self::Extension1|set#field::T value) → void
   ;
-static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T*
+static method Extension1|method<T extends core::num>(lowered final self::Class<self::Extension1|method::T> #this) → self::Extension1|method::T
   ;
-static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
-  return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T*
+static method Extension1|get#method<T extends core::num>(lowered final self::Class<self::Extension1|get#method::T> #this) → () → self::Extension1|get#method::T
+  return () → self::Extension1|get#method::T => self::Extension1|method<self::Extension1|get#method::T>(#this);
+static method Extension1|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension1|genericMethod::T> #this, self::Extension1|genericMethod::S t) → self::Extension1|genericMethod::T
   ;
-static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
+static method Extension1|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension1|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension1|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension1|get#genericMethod::T => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T, S>(#this, t);
+static method Extension2|get#field<T extends core::num>(lowered final self::Class<self::Extension2|get#field::T> #this) → self::Extension2|get#field::T
   ;
-static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void
+static method Extension2|set#field<T extends core::num>(lowered final self::Class<self::Extension2|set#field::T> #this, self::Extension2|set#field::T value) → void
   ;
-static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
+static method Extension2|method<T extends core::num>(lowered final self::Class<self::Extension2|method::T> #this) → self::Extension2|method::T
   ;
-static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
-  return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
+static method Extension2|get#method<T extends core::num>(lowered final self::Class<self::Extension2|get#method::T> #this) → () → self::Extension2|get#method::T
+  return () → self::Extension2|get#method::T => self::Extension2|method<self::Extension2|get#method::T>(#this);
+static method Extension2|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension2|genericMethod::T> #this, self::Extension2|genericMethod::S t) → self::Extension2|genericMethod::T
   ;
-static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension2|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension2|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension2|get#genericMethod::T => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T, S>(#this, t);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
index 225240c..911b823 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num*> extends core::Object {
-  covariant-by-class field self::Class::T* field1;
-  covariant-by-class field self::Class::T* field2;
-  constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
+class Class<T extends core::num> extends core::Object {
+  covariant-by-class field self::Class::T field1;
+  covariant-by-class field self::Class::T field2;
+  constructor •(self::Class::T field1, self::Class::T field2) → self::Class<self::Class::T>
     : self::Class::field1 = field1, self::Class::field2 = field2, super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num> on self::Class<T> {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -28,7 +18,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num> on self::Class<T> {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -36,99 +26,99 @@
   tearoff genericMethod = self::Extension2|get#genericMethod;
   set field = self::Extension2|set#field;
 }
-static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
-  self::Extension1|latestType = "${self::Extension1|get#field::T*}";
-  return #this.{self::Class::field1}{self::Extension1|get#field::T*};
+static field core::String? Extension1|latestType;
+static method Extension1|get#field<T extends core::num>(lowered final self::Class<self::Extension1|get#field::T> #this) → self::Extension1|get#field::T {
+  self::Extension1|latestType = "${self::Extension1|get#field::T}";
+  return #this.{self::Class::field1}{self::Extension1|get#field::T};
 }
-static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
-  self::Extension1|latestType = "${self::Extension1|set#field::T*}";
+static method Extension1|set#field<T extends core::num>(lowered final self::Class<self::Extension1|set#field::T> #this, self::Extension1|set#field::T value) → void {
+  self::Extension1|latestType = "${self::Extension1|set#field::T}";
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
-  self::Extension1|latestType = "${self::Extension1|method::T*}";
-  return #this.{self::Class::field1}{self::Extension1|method::T*};
+static method Extension1|method<T extends core::num>(lowered final self::Class<self::Extension1|method::T> #this) → self::Extension1|method::T {
+  self::Extension1|latestType = "${self::Extension1|method::T}";
+  return #this.{self::Class::field1}{self::Extension1|method::T};
 }
-static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
-  return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
-  self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
-  return #this.{self::Class::field1}{self::Extension1|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension1|genericMethod::T*;
+static method Extension1|get#method<T extends core::num>(lowered final self::Class<self::Extension1|get#method::T> #this) → () → self::Extension1|get#method::T
+  return () → self::Extension1|get#method::T => self::Extension1|method<self::Extension1|get#method::T>(#this);
+static method Extension1|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension1|genericMethod::T> #this, self::Extension1|genericMethod::S t) → self::Extension1|genericMethod::T {
+  self::Extension1|latestType = "${self::Extension1|genericMethod::T}:${self::Extension1|genericMethod::S}";
+  return #this.{self::Class::field1}{self::Extension1|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension1|genericMethod::T;
 }
-static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
-  return #this.{self::Class::field2}{self::Extension2|get#field::T*};
-static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+static method Extension1|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension1|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension1|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension1|get#genericMethod::T => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T, S>(#this, t);
+static method Extension2|get#field<T extends core::num>(lowered final self::Class<self::Extension2|get#field::T> #this) → self::Extension2|get#field::T
+  return #this.{self::Class::field2}{self::Extension2|get#field::T};
+static method Extension2|set#field<T extends core::num>(lowered final self::Class<self::Extension2|set#field::T> #this, self::Extension2|set#field::T value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
-  return #this.{self::Class::field2}{self::Extension2|method::T*};
-static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
-  return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
-  return #this.{self::Class::field2}{self::Extension2|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension2|genericMethod::T*;
-static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|method<T extends core::num>(lowered final self::Class<self::Extension2|method::T> #this) → self::Extension2|method::T
+  return #this.{self::Class::field2}{self::Extension2|method::T};
+static method Extension2|get#method<T extends core::num>(lowered final self::Class<self::Extension2|get#method::T> #this) → () → self::Extension2|get#method::T
+  return () → self::Extension2|get#method::T => self::Extension2|method<self::Extension2|get#method::T>(#this);
+static method Extension2|genericMethod<T extends core::num, S extends core::num>(lowered final self::Class<self::Extension2|genericMethod::T> #this, self::Extension2|genericMethod::S t) → self::Extension2|genericMethod::T
+  return #this.{self::Class::field2}{self::Extension2|genericMethod::T}.{core::num::+}(t){(core::num) → core::num} as{ForNonNullableByDefault} self::Extension2|genericMethod::T;
+static method Extension2|get#genericMethod<T extends core::num>(lowered final self::Class<self::Extension2|get#genericMethod::T> #this) → <S extends core::num>(S) → self::Extension2|get#genericMethod::T
+  return <S extends core::num>(S t) → self::Extension2|get#genericMethod::T => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T, S>(#this, t);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
-  self::expect(42, self::Extension1|get#field<core::num*>(c));
+  self::Class<core::int> c = new self::Class::•<core::int>(42, 87);
+  self::expect(42, self::Extension1|get#field<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|get#field<core::int*>(c));
+  self::expect(42, self::Extension1|get#field<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|get#field<core::num*>(c));
-  self::expect(42, self::Extension1|method<core::num*>(c));
+  self::expect(87, self::Extension2|get#field<core::num>(c));
+  self::expect(42, self::Extension1|method<core::num>(c));
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, self::Extension1|method<core::int*>(c));
+  self::expect(42, self::Extension1|method<core::int>(c));
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, self::Extension2|method<core::num*>(c));
-  () →* core::num* tearOffNumber1 = self::Extension1|get#method<core::num*>(c);
-  () →* core::int* tearOffInteger1 = self::Extension1|get#method<core::int*>(c);
-  () →* core::num* tearOff2 = self::Extension2|get#method<core::num*>(c);
-  self::expect(42, tearOffNumber1(){() →* core::num*});
+  self::expect(87, self::Extension2|method<core::num>(c));
+  () → core::num tearOffNumber1 = self::Extension1|get#method<core::num>(c);
+  () → core::int tearOffInteger1 = self::Extension1|get#method<core::int>(c);
+  () → core::num tearOff2 = self::Extension2|get#method<core::num>(c);
+  self::expect(42, tearOffNumber1(){() → core::num});
   self::expect("num", self::Extension1|latestType);
-  self::expect(42, tearOffInteger1(){() →* core::int*});
+  self::expect(42, tearOffInteger1(){() → core::int});
   self::expect("int", self::Extension1|latestType);
-  self::expect(87, tearOff2(){() →* core::num*});
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::int*>(c, 10));
+  self::expect(87, tearOff2(){() → core::num});
+  self::expect(52, self::Extension1|genericMethod<core::num, core::int>(c, 10));
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::int*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::num*, core::num*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::int>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num, core::num>(c, 10));
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, self::Extension2|genericMethod<core::num*, core::num*>(c, 10));
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num, core::num>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::num>(c, 10));
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int, core::int>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
-  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
-  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
-  self::expect(52, genericTearOffNumber1<core::int*>(10){(core::int*) →* core::num*});
+  <S extends core::num>(S) → core::num genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num>(c);
+  <S extends core::num>(S) → core::int genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int>(c);
+  <S extends core::num>(S) → core::num genericTearOff2 = self::Extension2|get#genericMethod<core::num>(c);
+  self::expect(52, genericTearOffNumber1<core::int>(10){(core::int) → core::num});
   self::expect("num:int", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::int*>(10){(core::int*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::int>(10){(core::int) → core::int});
   self::expect("int:int", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::num*});
-  self::expect(52, genericTearOffNumber1<core::num*>(10){(core::num*) →* core::num*});
+  self::expect(97, genericTearOff2<core::int>(10){(core::int) → core::num});
+  self::expect(52, genericTearOffNumber1<core::num>(10){(core::num) → core::num});
   self::expect("num:num", self::Extension1|latestType);
-  self::expect(52, genericTearOffInteger1<core::num*>(10){(core::num*) →* core::int*});
+  self::expect(52, genericTearOffInteger1<core::num>(10){(core::num) → core::int});
   self::expect("int:num", self::Extension1|latestType);
-  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::num*});
-  self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
+  self::expect(97, genericTearOff2<core::num>(10){(core::num) → core::num});
+  self::expect(23, let final self::Class<core::int> #t1 = c in let final core::int #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num>(#t1, #t2) in #t2);
   self::expect("num", self::Extension1|latestType);
-  self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
+  self::expect(23, let final self::Class<core::int> #t4 = c in let final core::int #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int>(#t4, #t5) in #t5);
   self::expect("int", self::Extension1|latestType);
-  self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
-  self::expect(23, self::Extension1|get#field<core::num*>(c));
-  self::expect(67, self::Extension2|get#field<core::num*>(c));
+  self::expect(67, let final self::Class<core::int> #t7 = c in let final core::int #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num>(#t7, #t8) in #t8);
+  self::expect(23, self::Extension1|get#field<core::num>(c));
+  self::expect(67, self::Extension2|get#field<core::num>(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart
index 64a0534..fc8cd69 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {}
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline.expect
index e158dbb..c1b8b08 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {}
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline_modelled.expect
index 311863a..43c658b 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 errors(Class c) {}
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.expect
index f0bae7e..a22bd35 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,23 +26,13 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
 }
-static method errors(self::Class* c) → dynamic {
+static method errors(self::Class c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:10:3: Error: Explicit extension application cannot be used as an expression.
   Extension(c);
   ^^^^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect
index f0bae7e..a22bd35 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,23 +26,13 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
 }
-static method errors(self::Class* c) → dynamic {
+static method errors(self::Class c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:10:3: Error: Explicit extension application cannot be used as an expression.
   Extension(c);
   ^^^^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.outline.expect
index f5961c4..bb12384 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.outline.expect
@@ -1,24 +1,14 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
 }
-static method errors(self::Class* c) → dynamic
+static method errors(self::Class c) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.transformed.expect
index f0bae7e..a22bd35 100644
--- a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,23 +26,13 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
 }
-static method errors(self::Class* c) → dynamic {
+static method errors(self::Class c) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:10:3: Error: Explicit extension application cannot be used as an expression.
   Extension(c);
   ^^^^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart b/pkg/front_end/testcases/extensions/explicit_this.dart
index 8557323..6e444df 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart
@@ -1,16 +1,16 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
   void method2() => this.method1();
 
-  Object method3() => this.field;
+  Object? method3() => this.field;
 
   void method4(Object o) {
     this.field = o;
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline.expect
index 63c3acd..67d83c3 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline.expect
@@ -1,12 +1,11 @@
-// @dart = 2.9
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
   void method2() => this.method1();
-  Object method3() => this.field;
+  Object? method3() => this.field;
   void method4(Object o) {}
 }
 
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline_modelled.expect
index fb368df..7fd231e 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.textual_outline_modelled.expect
@@ -1,11 +1,10 @@
-// @dart = 2.9
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
-  Object method3() => this.field;
+  Object? method3() => this.field;
   void method2() => this.method1();
   void method4(Object o) {}
 }
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.expect
index 9328ef6..862dfb1 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object) → void
+  return (core::Object o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect
index 9328ef6..862dfb1 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object) → void
+  return (core::Object o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.outline.expect
index 21fa5c7..7af82c7 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.outline.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field;
-  synthetic constructor •() → self::A1*
+  field core::Object? field;
+  synthetic constructor •() → self::A1
     ;
   method method1() → void
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
+static method A2|method2(lowered final self::A1 #this) → void
   ;
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
+static method A2|method3(lowered final self::A1 #this) → core::Object?
   ;
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object o) → void
   ;
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object) → void
+  return (core::Object o) → void => self::A2|method4(#this, o);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.transformed.expect
index 9328ef6..862dfb1 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.transformed.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object) → void
+  return (core::Object o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart b/pkg/front_end/testcases/extensions/export_from_dill/main.dart
index 3c64e58..6524b05 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'main_lib1.dart';
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect
index 37f878a..b27adef 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'main_lib1.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect
index 37f878a..b27adef 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'main_lib1.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.expect
index 214f428..afed0e9 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib2.dart" as mai;
 import "dart:core" as core;
@@ -16,7 +16,7 @@
   #C2;
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "main_lib2.dart" as mai;
 additionalExports = (mai::Extension)
@@ -24,11 +24,11 @@
 export "org-dartlang-testcase:///main_lib2.dart";
 
 
-library;
+library /*isNonNullableByDefault*/;
 import self as mai;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = mai::Extension|get#instanceProperty;
   method instanceMethod = mai::Extension|instanceMethod;
   tearoff instanceMethod = mai::Extension|get#instanceMethod;
@@ -40,18 +40,18 @@
   set instanceProperty = mai::Extension|set#instanceProperty;
   static set staticProperty = set mai::Extension|staticProperty;
 }
-static field core::int* Extension|staticField = 42;
-static final field core::int* Extension|staticFinalField = 42;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField = 42;
+static final field core::int Extension|staticFinalField = 42;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   return 42;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|instanceMethod(lowered final core::int* #this) → void {}
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void {}
+static method Extension|instanceMethod(lowered final core::int #this) → void {}
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => mai::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   return 42;
-static set Extension|staticProperty(core::int* value) → void {}
+static set Extension|staticProperty(core::int value) → void {}
 static method Extension|staticMethod() → void {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect
index 6a3bebc..f4287ea 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib2.dart" as mai;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.outline.expect
index 70bd997..5a68e2d 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///main_lib1.dart";
@@ -6,7 +6,7 @@
 static method main() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "main_lib2.dart" as mai;
 additionalExports = (mai::Extension)
@@ -14,11 +14,11 @@
 export "org-dartlang-testcase:///main_lib2.dart";
 
 
-library;
+library /*isNonNullableByDefault*/;
 import self as mai;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = mai::Extension|get#instanceProperty;
   method instanceMethod = mai::Extension|instanceMethod;
   tearoff instanceMethod = mai::Extension|get#instanceMethod;
@@ -30,20 +30,20 @@
   set instanceProperty = mai::Extension|set#instanceProperty;
   static set staticProperty = set mai::Extension|staticProperty;
 }
-static field core::int* Extension|staticField;
-static final field core::int* Extension|staticFinalField;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField;
+static final field core::int Extension|staticFinalField;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   ;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|instanceMethod(lowered final core::int* #this) → void
+static method Extension|instanceMethod(lowered final core::int #this) → void
   ;
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => mai::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   ;
-static set Extension|staticProperty(core::int* value) → void
+static set Extension|staticProperty(core::int value) → void
   ;
 static method Extension|staticMethod() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.transformed.expect
index 214f428..afed0e9 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib2.dart" as mai;
 import "dart:core" as core;
@@ -16,7 +16,7 @@
   #C2;
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "main_lib2.dart" as mai;
 additionalExports = (mai::Extension)
@@ -24,11 +24,11 @@
 export "org-dartlang-testcase:///main_lib2.dart";
 
 
-library;
+library /*isNonNullableByDefault*/;
 import self as mai;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = mai::Extension|get#instanceProperty;
   method instanceMethod = mai::Extension|instanceMethod;
   tearoff instanceMethod = mai::Extension|get#instanceMethod;
@@ -40,18 +40,18 @@
   set instanceProperty = mai::Extension|set#instanceProperty;
   static set staticProperty = set mai::Extension|staticProperty;
 }
-static field core::int* Extension|staticField = 42;
-static final field core::int* Extension|staticFinalField = 42;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField = 42;
+static final field core::int Extension|staticFinalField = 42;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   return 42;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|instanceMethod(lowered final core::int* #this) → void {}
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void {}
+static method Extension|instanceMethod(lowered final core::int #this) → void {}
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => mai::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   return 42;
-static set Extension|staticProperty(core::int* value) → void {}
+static set Extension|staticProperty(core::int value) → void {}
 static method Extension|staticMethod() → void {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart b/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart
index 3ea16b6..6c6153b 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart
@@ -1,5 +1,5 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 export 'main_lib2.dart';
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart b/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart
index 4eba373..b08ae03 100644
--- a/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on int {
   int get instanceProperty => 42;
   void set instanceProperty(int value) {}
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart b/pkg/front_end/testcases/extensions/export_twice.dart
index da8915c..6fdc20a 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart
+++ b/pkg/front_end/testcases/extensions/export_twice.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'export_twice_lib1.dart';
 import 'export_twice_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline.expect
index 1fc614e..3e4ce72 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'export_twice_lib1.dart';
 import 'export_twice_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline_modelled.expect
index 1fc614e..3e4ce72 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'export_twice_lib1.dart';
 import 'export_twice_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.weak.expect b/pkg/front_end/testcases/extensions/export_twice.dart.weak.expect
index d7eef99..ffd5701 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "export_twice_lib1.dart" as exp;
 
@@ -9,34 +9,24 @@
   exp::Extension|method(new exp::Class::•());
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as exp;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → exp::Class*
+  synthetic constructor •() → exp::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on exp::Class* {
+extension Extension on exp::Class {
   method method = exp::Extension|method;
   tearoff method = exp::Extension|get#method;
 }
-static method Extension|method(lowered final exp::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final exp::Class* #this) → () →* dynamic
+static method Extension|method(lowered final exp::Class #this) → dynamic {}
+static method Extension|get#method(lowered final exp::Class #this) → () → dynamic
   return () → dynamic => exp::Extension|method(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "export_twice_lib1.dart" as exp;
 additionalExports = (exp::Extension)
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect
index d7eef99..ffd5701 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "export_twice_lib1.dart" as exp;
 
@@ -9,34 +9,24 @@
   exp::Extension|method(new exp::Class::•());
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as exp;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → exp::Class*
+  synthetic constructor •() → exp::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on exp::Class* {
+extension Extension on exp::Class {
   method method = exp::Extension|method;
   tearoff method = exp::Extension|get#method;
 }
-static method Extension|method(lowered final exp::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final exp::Class* #this) → () →* dynamic
+static method Extension|method(lowered final exp::Class #this) → dynamic {}
+static method Extension|get#method(lowered final exp::Class #this) → () → dynamic
   return () → dynamic => exp::Extension|method(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "export_twice_lib1.dart" as exp;
 additionalExports = (exp::Extension)
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/export_twice.dart.weak.outline.expect
index a7b9b7e..b4f09a9 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///export_twice_lib1.dart";
@@ -7,34 +7,24 @@
 static method main() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self2::Class*
+  synthetic constructor •() → self2::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self2::Class* {
+extension Extension on self2::Class {
   method method = self2::Extension|method;
   tearoff method = self2::Extension|get#method;
 }
-static method Extension|method(lowered final self2::Class* #this) → dynamic
+static method Extension|method(lowered final self2::Class #this) → dynamic
   ;
-static method Extension|get#method(lowered final self2::Class* #this) → () →* dynamic
+static method Extension|get#method(lowered final self2::Class #this) → () → dynamic
   return () → dynamic => self2::Extension|method(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self3;
 import "export_twice_lib1.dart" as self2;
 additionalExports = (self2::Extension)
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/export_twice.dart.weak.transformed.expect
index d7eef99..ffd5701 100644
--- a/pkg/front_end/testcases/extensions/export_twice.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "export_twice_lib1.dart" as exp;
 
@@ -9,34 +9,24 @@
   exp::Extension|method(new exp::Class::•());
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as exp;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → exp::Class*
+  synthetic constructor •() → exp::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on exp::Class* {
+extension Extension on exp::Class {
   method method = exp::Extension|method;
   tearoff method = exp::Extension|get#method;
 }
-static method Extension|method(lowered final exp::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final exp::Class* #this) → () →* dynamic
+static method Extension|method(lowered final exp::Class #this) → dynamic {}
+static method Extension|get#method(lowered final exp::Class #this) → () → dynamic
   return () → dynamic => exp::Extension|method(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "export_twice_lib1.dart" as exp;
 additionalExports = (exp::Extension)
diff --git a/pkg/front_end/testcases/extensions/export_twice_lib1.dart b/pkg/front_end/testcases/extensions/export_twice_lib1.dart
index 22867f5..1004de0 100644
--- a/pkg/front_end/testcases/extensions/export_twice_lib1.dart
+++ b/pkg/front_end/testcases/extensions/export_twice_lib1.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/export_twice_lib2.dart b/pkg/front_end/testcases/extensions/export_twice_lib2.dart
index 59fe68b..adeca01 100644
--- a/pkg/front_end/testcases/extensions/export_twice_lib2.dart
+++ b/pkg/front_end/testcases/extensions/export_twice_lib2.dart
@@ -1,5 +1,5 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 export 'export_twice_lib1.dart' show Extension;
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart b/pkg/front_end/testcases/extensions/extension_call.dart
index 4df75bd..026883a 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart
+++ b/pkg/front_end/testcases/extensions/extension_call.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class<T> {
   T method(T a) => a;
 }
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline.expect
index 5083960..3acad15 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T> {
   T method(T a) => a;
 }
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline_modelled.expect
index 2f1e610..7edde0e 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T> {
   T method(T a) => a;
 }
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_call.dart.weak.expect
index 13106a6..c844073 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.weak.expect
@@ -1,43 +1,33 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  method method(covariant-by-class self::Class::T* a) → self::Class::T*
+  method method(covariant-by-class self::Class::T% a) → self::Class::T%
     return a;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
-  return #this.{self::Class::method}(a){(self::Extension|call::T*) →* self::Extension|call::T*};
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
-  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
+static method Extension|call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|call::T%> #this, self::Extension|call::T% a) → self::Extension|call::T%
+  return #this.{self::Class::method}(a){(self::Extension|call::T%) → self::Extension|call::T%};
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#call::T%> #this) → (self::Extension|get#call::T%) → self::Extension|get#call::T%
+  return (self::Extension|get#call::T% a) → self::Extension|get#call::T% => self::Extension|call<self::Extension|get#call::T%>(#this, a);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>();
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
+  self::Class<core::int> c = new self::Class::•<core::int>();
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect
index 13106a6..c844073 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect
@@ -1,43 +1,33 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  method method(covariant-by-class self::Class::T* a) → self::Class::T*
+  method method(covariant-by-class self::Class::T% a) → self::Class::T%
     return a;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
-  return #this.{self::Class::method}(a){(self::Extension|call::T*) →* self::Extension|call::T*};
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
-  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
+static method Extension|call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|call::T%> #this, self::Extension|call::T% a) → self::Extension|call::T%
+  return #this.{self::Class::method}(a){(self::Extension|call::T%) → self::Extension|call::T%};
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#call::T%> #this) → (self::Extension|get#call::T%) → self::Extension|get#call::T%
+  return (self::Extension|get#call::T% a) → self::Extension|get#call::T% => self::Extension|call<self::Extension|get#call::T%>(#this, a);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>();
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
+  self::Class<core::int> c = new self::Class::•<core::int>();
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_call.dart.weak.outline.expect
index b4a47b5..2705423 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.weak.outline.expect
@@ -1,31 +1,21 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     ;
-  method method(covariant-by-class self::Class::T* a) → self::Class::T*
+  method method(covariant-by-class self::Class::T% a) → self::Class::T%
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
+static method Extension|call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|call::T%> #this, self::Extension|call::T% a) → self::Extension|call::T%
   ;
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
-  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#call::T%> #this) → (self::Extension|get#call::T%) → self::Extension|get#call::T%
+  return (self::Extension|get#call::T% a) → self::Extension|get#call::T% => self::Extension|call<self::Extension|get#call::T%>(#this, a);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_call.dart.weak.transformed.expect
index 13106a6..c844073 100644
--- a/pkg/front_end/testcases/extensions/extension_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.weak.transformed.expect
@@ -1,43 +1,33 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  method method(covariant-by-class self::Class::T* a) → self::Class::T*
+  method method(covariant-by-class self::Class::T% a) → self::Class::T%
     return a;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
-  return #this.{self::Class::method}(a){(self::Extension|call::T*) →* self::Extension|call::T*};
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
-  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
+static method Extension|call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|call::T%> #this, self::Extension|call::T% a) → self::Extension|call::T%
+  return #this.{self::Class::method}(a){(self::Extension|call::T%) → self::Extension|call::T%};
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#call::T%> #this) → (self::Extension|get#call::T%) → self::Extension|get#call::T%
+  return (self::Extension|get#call::T% a) → self::Extension|get#call::T% => self::Extension|call<self::Extension|get#call::T%>(#this, a);
 static method main() → dynamic {
-  self::Class<core::int*>* c = new self::Class::•<core::int*>();
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
-  self::expect(42, self::Extension|call<core::int*>(c, 42));
-  self::expect(87, self::Extension|call<core::int*>(c, 87));
-  self::expect(123, self::Extension|call<core::int*>(c, 123));
+  self::Class<core::int> c = new self::Class::•<core::int>();
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
+  self::expect(42, self::Extension|call<core::int>(c, 42));
+  self::expect(87, self::Extension|call<core::int>(c, 87));
+  self::expect(123, self::Extension|call<core::int>(c, 123));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart b/pkg/front_end/testcases/extensions/extension_constructor.dart
index 44773f4..5cd257d 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.textual_outline.expect
index d24be05..ac6bee2 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 extension Extension on Class {
   Extension() {}
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.expect
index 8400d5d..f86c11f 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,25 +26,15 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+static method Extension|method(lowered final self::Class #this) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|method(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect
index 8400d5d..f86c11f 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,25 +26,15 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+static method Extension|method(lowered final self::Class #this) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|method(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.outline.expect
index fec0bcb..7ef855d 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,26 +26,16 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this) → dynamic
+static method Extension|method(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|method(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.transformed.expect
index 8400d5d..f86c11f 100644
--- a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,25 +26,15 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+static method Extension|method(lowered final self::Class #this) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|method(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart b/pkg/front_end/testcases/extensions/extension_member_conflict.dart
index 547cb0e..ef4e4de 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension<T> on int {
   int get duplicateInstanceGetter => 0;
   int get duplicateInstanceGetter => 0;
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline.expect
index 7404877..f9f55d9 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension<T> on int {
   int get duplicateInstanceGetter => 0;
   int get duplicateInstanceGetter => 0;
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline_modelled.expect
index 903bc75..88f38e3 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension<T> on int {
   int get duplicateInstanceGetter => 0;
   int get duplicateInstanceGetter => 0;
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.expect
index fd72cf1..d2335e5 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -140,7 +140,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension<T extends core::Object* = dynamic> on core::int* {
+extension Extension<T extends core::Object? = dynamic> on core::int {
   get duplicateInstanceGetter = self::Extension|get#duplicateInstanceGetter;
   method duplicateInstanceMethod = self::Extension|duplicateInstanceMethod;
   tearoff duplicateInstanceMethod = self::Extension|get#duplicateInstanceMethod;
@@ -168,42 +168,42 @@
   set instanceSetterAndStaticGetter = self::Extension|set#instanceSetterAndStaticGetter;
   set instanceSetterAndStaticField = self::Extension|set#instanceSetterAndStaticField;
 }
-static field core::int* Extension|duplicateStaticField;
-static method Extension|get#duplicateInstanceGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static field core::int Extension|duplicateStaticField;
+static method Extension|get#duplicateInstanceGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → void {}
-static method Extension|get#duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → () →* void
-  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T*>(#this);
-static get Extension|duplicateStaticGetter() → core::int*
+static method Extension|set#duplicateInstanceSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → void {}
+static method Extension|get#duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → () → void
+  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T%>(#this);
+static get Extension|duplicateStaticGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetter(core::int* value) → void {}
+static set Extension|duplicateStaticSetter(core::int value) → void {}
 static method Extension|duplicateStaticMethod() → void {}
-static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static get Extension|duplicateStaticGetterPlusSetter() → core::int*
+static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static get Extension|duplicateStaticGetterPlusSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterPlusSetter(core::int* value) → void {}
-static get Extension|duplicateStaticSetterPlusGetter() → core::int*
+static set Extension|duplicateStaticGetterPlusSetter(core::int value) → void {}
+static get Extension|duplicateStaticSetterPlusGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetterPlusGetter(core::int* value) → void {}
-static get Extension|duplicateStaticGetterAndSetter() → core::int*
+static set Extension|duplicateStaticSetterPlusGetter(core::int value) → void {}
+static get Extension|duplicateStaticGetterAndSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterAndSetter(core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static set Extension|duplicateStaticGetterAndSetter(core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static set Extension|instanceGetterAndStaticSetter(core::int* value) → void {}
-static get Extension|instanceSetterAndStaticGetter() → core::int*
+static set Extension|instanceGetterAndStaticSetter(core::int value) → void {}
+static get Extension|instanceSetterAndStaticGetter() → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|set#instanceSetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect
index fd72cf1..d2335e5 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -140,7 +140,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension<T extends core::Object* = dynamic> on core::int* {
+extension Extension<T extends core::Object? = dynamic> on core::int {
   get duplicateInstanceGetter = self::Extension|get#duplicateInstanceGetter;
   method duplicateInstanceMethod = self::Extension|duplicateInstanceMethod;
   tearoff duplicateInstanceMethod = self::Extension|get#duplicateInstanceMethod;
@@ -168,42 +168,42 @@
   set instanceSetterAndStaticGetter = self::Extension|set#instanceSetterAndStaticGetter;
   set instanceSetterAndStaticField = self::Extension|set#instanceSetterAndStaticField;
 }
-static field core::int* Extension|duplicateStaticField;
-static method Extension|get#duplicateInstanceGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static field core::int Extension|duplicateStaticField;
+static method Extension|get#duplicateInstanceGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → void {}
-static method Extension|get#duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → () →* void
-  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T*>(#this);
-static get Extension|duplicateStaticGetter() → core::int*
+static method Extension|set#duplicateInstanceSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → void {}
+static method Extension|get#duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → () → void
+  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T%>(#this);
+static get Extension|duplicateStaticGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetter(core::int* value) → void {}
+static set Extension|duplicateStaticSetter(core::int value) → void {}
 static method Extension|duplicateStaticMethod() → void {}
-static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static get Extension|duplicateStaticGetterPlusSetter() → core::int*
+static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static get Extension|duplicateStaticGetterPlusSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterPlusSetter(core::int* value) → void {}
-static get Extension|duplicateStaticSetterPlusGetter() → core::int*
+static set Extension|duplicateStaticGetterPlusSetter(core::int value) → void {}
+static get Extension|duplicateStaticSetterPlusGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetterPlusGetter(core::int* value) → void {}
-static get Extension|duplicateStaticGetterAndSetter() → core::int*
+static set Extension|duplicateStaticSetterPlusGetter(core::int value) → void {}
+static get Extension|duplicateStaticGetterAndSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterAndSetter(core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static set Extension|duplicateStaticGetterAndSetter(core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static set Extension|instanceGetterAndStaticSetter(core::int* value) → void {}
-static get Extension|instanceSetterAndStaticGetter() → core::int*
+static set Extension|instanceGetterAndStaticSetter(core::int value) → void {}
+static get Extension|instanceSetterAndStaticGetter() → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|set#instanceSetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.outline.expect
index 4010730..649c9bc 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -140,7 +140,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension<T extends core::Object* = dynamic> on core::int* {
+extension Extension<T extends core::Object? = dynamic> on core::int {
   get duplicateInstanceGetter = self::Extension|get#duplicateInstanceGetter;
   method duplicateInstanceMethod = self::Extension|duplicateInstanceMethod;
   tearoff duplicateInstanceMethod = self::Extension|get#duplicateInstanceMethod;
@@ -168,56 +168,56 @@
   set instanceSetterAndStaticGetter = self::Extension|set#instanceSetterAndStaticGetter;
   set instanceSetterAndStaticField = self::Extension|set#instanceSetterAndStaticField;
 }
-static field core::int* Extension|duplicateStaticField;
-static method Extension|get#duplicateInstanceGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static field core::int Extension|duplicateStaticField;
+static method Extension|get#duplicateInstanceGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#duplicateInstanceSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#duplicateInstanceSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → void
+static method Extension|duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → void
   ;
-static method Extension|get#duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → () →* void
-  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T*>(#this);
-static get Extension|duplicateStaticGetter() → core::int*
+static method Extension|get#duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → () → void
+  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T%>(#this);
+static get Extension|duplicateStaticGetter() → core::int
   ;
-static set Extension|duplicateStaticSetter(core::int* value) → void
+static set Extension|duplicateStaticSetter(core::int value) → void
   ;
 static method Extension|duplicateStaticMethod() → void
   ;
-static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
-static get Extension|duplicateStaticGetterPlusSetter() → core::int*
+static get Extension|duplicateStaticGetterPlusSetter() → core::int
   ;
-static set Extension|duplicateStaticGetterPlusSetter(core::int* value) → void
+static set Extension|duplicateStaticGetterPlusSetter(core::int value) → void
   ;
-static get Extension|duplicateStaticSetterPlusGetter() → core::int*
+static get Extension|duplicateStaticSetterPlusGetter() → core::int
   ;
-static set Extension|duplicateStaticSetterPlusGetter(core::int* value) → void
+static set Extension|duplicateStaticSetterPlusGetter(core::int value) → void
   ;
-static get Extension|duplicateStaticGetterAndSetter() → core::int*
+static get Extension|duplicateStaticGetterAndSetter() → core::int
   ;
-static set Extension|duplicateStaticGetterAndSetter(core::int* value) → void
+static set Extension|duplicateStaticGetterAndSetter(core::int value) → void
   ;
-static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static set Extension|instanceGetterAndStaticSetter(core::int* value) → void
+static set Extension|instanceGetterAndStaticSetter(core::int value) → void
   ;
-static get Extension|instanceSetterAndStaticGetter() → core::int*
+static get Extension|instanceSetterAndStaticGetter() → core::int
   ;
-static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|get#instanceGetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#instanceGetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#instanceSetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#instanceSetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.transformed.expect
index fd72cf1..d2335e5 100644
--- a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -140,7 +140,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension<T extends core::Object* = dynamic> on core::int* {
+extension Extension<T extends core::Object? = dynamic> on core::int {
   get duplicateInstanceGetter = self::Extension|get#duplicateInstanceGetter;
   method duplicateInstanceMethod = self::Extension|duplicateInstanceMethod;
   tearoff duplicateInstanceMethod = self::Extension|get#duplicateInstanceMethod;
@@ -168,42 +168,42 @@
   set instanceSetterAndStaticGetter = self::Extension|set#instanceSetterAndStaticGetter;
   set instanceSetterAndStaticField = self::Extension|set#instanceSetterAndStaticField;
 }
-static field core::int* Extension|duplicateStaticField;
-static method Extension|get#duplicateInstanceGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static field core::int Extension|duplicateStaticField;
+static method Extension|get#duplicateInstanceGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → void {}
-static method Extension|get#duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → () →* void
-  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T*>(#this);
-static get Extension|duplicateStaticGetter() → core::int*
+static method Extension|set#duplicateInstanceSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → void {}
+static method Extension|get#duplicateInstanceMethod<T extends core::Object? = dynamic>(lowered final core::int #this) → () → void
+  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T%>(#this);
+static get Extension|duplicateStaticGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetter(core::int* value) → void {}
+static set Extension|duplicateStaticSetter(core::int value) → void {}
 static method Extension|duplicateStaticMethod() → void {}
-static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static get Extension|duplicateStaticGetterPlusSetter() → core::int*
+static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static get Extension|duplicateStaticGetterPlusSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterPlusSetter(core::int* value) → void {}
-static get Extension|duplicateStaticSetterPlusGetter() → core::int*
+static set Extension|duplicateStaticGetterPlusSetter(core::int value) → void {}
+static get Extension|duplicateStaticSetterPlusGetter() → core::int
   return 0;
-static set Extension|duplicateStaticSetterPlusGetter(core::int* value) → void {}
-static get Extension|duplicateStaticGetterAndSetter() → core::int*
+static set Extension|duplicateStaticSetterPlusGetter(core::int value) → void {}
+static get Extension|duplicateStaticGetterAndSetter() → core::int
   return 0;
-static set Extension|duplicateStaticGetterAndSetter(core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static set Extension|duplicateStaticGetterAndSetter(core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static set Extension|instanceGetterAndStaticSetter(core::int* value) → void {}
-static get Extension|instanceSetterAndStaticGetter() → core::int*
+static set Extension|instanceGetterAndStaticSetter(core::int value) → void {}
+static get Extension|instanceSetterAndStaticGetter() → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|get#instanceGetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
+static method Extension|get#instanceGetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#instanceSetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|set#instanceSetterAndStaticField<T extends core::Object? = dynamic>(lowered final core::int #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart b/pkg/front_end/testcases/extensions/extension_methods.dart
index 958a313..079b344 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 import 'package:expect/expect.dart';
 
 class C {
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline.expect
index 298f478..5ed8d9d8 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'package:expect/expect.dart';
 
 class C {
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline_modelled.expect
index 298f478..5ed8d9d8 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'package:expect/expect.dart';
 
 class C {
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.expect
index dd3ee97..4ac2693 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
@@ -6,29 +6,19 @@
 import "package:expect/expect.dart";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  get one() → core::int*
+  get one() → core::int
     return 1;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   get two = self::E|get#two;
 }
-static method E|get#two(lowered final self::C* #this) → core::int*
+static method E|get#two(lowered final self::C #this) → core::int
   return 2;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  core::int* result = c.{self::C::one}{core::int*}.{core::num::+}(self::E|get#two(c)){(core::num*) →* core::int*};
+  self::C c = new self::C::•();
+  core::int result = c.{self::C::one}{core::int}.{core::num::+}(self::E|get#two(c)){(core::num) → core::int};
   exp::Expect::equals(result, 3);
 }
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect
index dd3ee97..4ac2693 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
@@ -6,29 +6,19 @@
 import "package:expect/expect.dart";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  get one() → core::int*
+  get one() → core::int
     return 1;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   get two = self::E|get#two;
 }
-static method E|get#two(lowered final self::C* #this) → core::int*
+static method E|get#two(lowered final self::C #this) → core::int
   return 2;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  core::int* result = c.{self::C::one}{core::int*}.{core::num::+}(self::E|get#two(c)){(core::num*) →* core::int*};
+  self::C c = new self::C::•();
+  core::int result = c.{self::C::one}{core::int}.{core::num::+}(self::E|get#two(c)){(core::num) → core::int};
   exp::Expect::equals(result, 3);
 }
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.outline.expect
index 20fb805..d7ba71b 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.outline.expect
@@ -1,29 +1,19 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 import "package:expect/expect.dart";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     ;
-  get one() → core::int*
+  get one() → core::int
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   get two = self::E|get#two;
 }
-static method E|get#two(lowered final self::C* #this) → core::int*
+static method E|get#two(lowered final self::C #this) → core::int
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.transformed.expect
index dd3ee97..4ac2693 100644
--- a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
@@ -6,29 +6,19 @@
 import "package:expect/expect.dart";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  get one() → core::int*
+  get one() → core::int
     return 1;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   get two = self::E|get#two;
 }
-static method E|get#two(lowered final self::C* #this) → core::int*
+static method E|get#two(lowered final self::C #this) → core::int
   return 2;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  core::int* result = c.{self::C::one}{core::int*}.{core::num::+}(self::E|get#two(c)){(core::num*) →* core::int*};
+  self::C c = new self::C::•();
+  core::int result = c.{self::C::one}{core::int}.{core::num::+}(self::E|get#two(c)){(core::num) → core::int};
   exp::Expect::equals(result, 3);
 }
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart b/pkg/front_end/testcases/extensions/extension_setter.dart
index de402ac..99a3f11 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Class {
   int field;
 }
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.weak.transformed.expect
index 27a9a41..795fc5b 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.weak.transformed.expect
@@ -224,104 +224,104 @@
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:47:30 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:47:30 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:51:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:51:32 -> IntConstant(2)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:56:24 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:58:34 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:58:34 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:60:12 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:65:25 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:67:35 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:67:35 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:69:12 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:86:30 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:86:30 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:89:41 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:89:41 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:93:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:93:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:97:43 -> IntConstant(6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:97:43 -> IntConstant(6)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:102:24 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:104:34 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:104:34 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:106:10 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:110:35 -> IntConstant(-6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:112:45 -> IntConstant(7)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:112:45 -> IntConstant(7)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:114:10 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:119:25 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:121:35 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:121:35 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:123:10 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:127:36 -> IntConstant(-6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:129:46 -> IntConstant(7)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:129:46 -> IntConstant(7)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:131:10 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:136:31 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:136:31 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:139:41 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:139:41 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:143:33 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:143:33 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:147:43 -> IntConstant(6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:147:43 -> IntConstant(6)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:152:25 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:154:35 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:154:35 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:156:10 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:160:35 -> IntConstant(-6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:162:45 -> IntConstant(7)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:162:45 -> IntConstant(7)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:164:10 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:169:26 -> IntConstant(-2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:171:36 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:171:36 -> IntConstant(3)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:173:10 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:177:36 -> IntConstant(-6)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:179:46 -> IntConstant(7)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:179:46 -> IntConstant(7)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:181:10 -> IntConstant(-8)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:187:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:187:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:49:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:49:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:53:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:53:32 -> IntConstant(2)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:58:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:34 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:62:12 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:62:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:62:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:62:35 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:67:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:35 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:71:12 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:71:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:71:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:71:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:88:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:88:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:91:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:91:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:95:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:95:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:99:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:99:43 -> IntConstant(6)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:104:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:34 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:108:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:108:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:108:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:108:35 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:112:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:45 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:116:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:116:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:116:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:116:46 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:121:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:35 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:125:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:125:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:125:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:125:36 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:129:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:46 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:133:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:133:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:133:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:133:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:138:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:138:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:141:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:141:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:145:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:145:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:149:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:149:43 -> IntConstant(6)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:154:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:35 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:158:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:158:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:158:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:158:36 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:162:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:45 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:166:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:166:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:166:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:166:46 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:171:26 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:36 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:36 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:175:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:175:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:175:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:175:37 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:179:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:46 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:183:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter.dart:183:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:183:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:183:47 -> IntConstant(-8)
 Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:189:32 -> IntConstant(2)
 Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:189:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:194:33 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:194:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:191:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:191:32 -> IntConstant(2)
 Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:196:33 -> IntConstant(2)
 Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:196:33 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:198:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:198:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:203:53 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:203:53 -> IntConstant(1)
 Extra constant evaluation: evaluated: 835, effectively constant: 100
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart b/pkg/front_end/testcases/extensions/extension_setter2.dart
new file mode 100644
index 0000000..4709711
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart
@@ -0,0 +1,222 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  int field;
+  int? nullableField;
+
+  Class(this.field);
+}
+
+extension Extension on Class {
+  int get simpleSetter => field;
+
+  set simpleSetter(int value) {
+    field = value;
+  }
+
+  int? get simpleNullableSetter => nullableField;
+
+  set simpleNullableSetter(int? value) {
+    nullableField = value;
+  }
+
+  int get mutatingSetter => field;
+
+  set mutatingSetter(int value) {
+    value = value + 1;
+    field = value;
+  }
+
+  int get setterWithReturn => field;
+
+  set setterWithReturn(int value) {
+    if (value < 0) {
+      field = -value;
+      return;
+    }
+    field = value;
+  }
+
+  int get setterWithClosure => field;
+
+  set setterWithClosure(int value) {
+    abs(value) {
+      return value < 0 ? -value : value;
+    }
+
+    field = abs(value);
+  }
+
+  testInternal() {
+    expect(-1, field);
+
+    simpleSetter = 0;
+    expect(0, field);
+    expect(1, simpleSetter = 1);
+
+    mutatingSetter = 0;
+    expect(1, field);
+    expect(2, mutatingSetter = 2);
+    expect(3, field);
+
+    setterWithReturn = 1;
+    expect(1, field);
+    setterWithReturn = -2;
+    expect(2, field);
+    expect(3, setterWithReturn = 3);
+    expect(3, field);
+    expect(-4, setterWithReturn = -4);
+    expect(4, field);
+
+    setterWithClosure = 1;
+    expect(1, field);
+    setterWithClosure = -2;
+    expect(2, field);
+    expect(3, setterWithClosure = 3);
+    expect(3, field);
+    expect(-4, setterWithClosure = -4);
+    expect(4, field);
+  }
+}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T> {
+  set setter(T value) {}
+}
+
+main() {
+  var c = new Class(-1);
+  test(c, c);
+}
+
+test(Class c, Class? cn) {
+  expect(-1, c.field);
+
+  c.simpleSetter = 0;
+  expect(0, c.field);
+  expect(1, c.simpleSetter = 1);
+  Extension(c).simpleSetter = 2;
+  expect(2, c.field);
+  expect(3, Extension(c).simpleSetter = 3);
+
+  c.mutatingSetter = 0;
+  expect(1, c.field);
+  expect(2, c.mutatingSetter = 2);
+  expect(3, c.field);
+  Extension(c).mutatingSetter = 4;
+  expect(5, c.field);
+  expect(6, Extension(c).mutatingSetter = 6);
+  expect(7, c.field);
+
+  c.setterWithReturn = 1;
+  expect(1, c.field);
+  c.setterWithReturn = -2;
+  expect(2, c.field);
+  expect(3, c.setterWithReturn = 3);
+  expect(3, c.field);
+  expect(-4, c.setterWithReturn = -4);
+  expect(4, c.field);
+  Extension(c).setterWithReturn = 5;
+  expect(5, c.field);
+  Extension(c).setterWithReturn = -6;
+  expect(6, c.field);
+  expect(7, Extension(c).setterWithReturn = 7);
+  expect(7, c.field);
+  expect(-8, Extension(c).setterWithReturn = -8);
+  expect(8, c.field);
+
+  c.setterWithClosure = 1;
+  expect(1, c.field);
+  c.setterWithClosure = -2;
+  expect(2, c.field);
+  expect(3, c.setterWithClosure = 3);
+  expect(3, c.field);
+  expect(-4, c.setterWithClosure = -4);
+  expect(4, c.field);
+  Extension(c).setterWithClosure = 5;
+  expect(5, c.field);
+  Extension(c).setterWithClosure = -6;
+  expect(6, c.field);
+  expect(7, Extension(c).setterWithClosure = 7);
+  expect(7, c.field);
+  expect(-8, Extension(c).setterWithClosure = -8);
+  expect(8, c.field);
+
+  c.simpleSetter = 0;
+  expect(0, cn?.field);
+  expect(1, cn?.simpleSetter = 1);
+  Extension(c).simpleSetter = 2;
+  expect(2, cn?.field);
+  expect(3, Extension(c).simpleSetter = 3);
+
+  c.mutatingSetter = 0;
+  expect(1, cn?.field);
+  expect(2, cn?.mutatingSetter = 2);
+  expect(3, cn?.field);
+  Extension(c).mutatingSetter = 4;
+  expect(5, cn?.field);
+  expect(6, Extension(c).mutatingSetter = 6);
+  expect(7, cn?.field);
+
+  cn?.setterWithReturn = 1;
+  expect(1, cn?.field);
+  cn?.setterWithReturn = -2;
+  expect(2, cn?.field);
+  expect(3, cn?.setterWithReturn = 3);
+  expect(3, cn?.field);
+  expect(-4, cn?.setterWithReturn = -4);
+  expect(4, cn?.field);
+  Extension(c).setterWithReturn = 5;
+  expect(5, cn?.field);
+  Extension(c).setterWithReturn = -6;
+  expect(6, cn?.field);
+  expect(7, Extension(c).setterWithReturn = 7);
+  expect(7, cn?.field);
+  expect(-8, Extension(c).setterWithReturn = -8);
+  expect(8, cn?.field);
+
+  cn?.setterWithClosure = 1;
+  expect(1, cn?.field);
+  cn?.setterWithClosure = -2;
+  expect(2, cn?.field);
+  expect(3, cn?.setterWithClosure = 3);
+  expect(3, cn?.field);
+  expect(-4, cn?.setterWithClosure = -4);
+  expect(4, cn?.field);
+  Extension(c).setterWithClosure = 5;
+  expect(5, cn?.field);
+  Extension(c).setterWithClosure = -6;
+  expect(6, cn?.field);
+  expect(7, Extension(c).setterWithClosure = 7);
+  expect(7, cn?.field);
+  expect(-8, Extension(c).setterWithClosure = -8);
+  expect(8, cn?.field);
+
+  c.nullableField = null;
+  c.simpleNullableSetter ??= 1;
+  expect(1, c.nullableField);
+  expect(1, c.simpleNullableSetter ??= 2);
+  c.nullableField = null;
+  expect(2, c.simpleNullableSetter ??= 2);
+
+  cn?.nullableField = null;
+  cn?.simpleNullableSetter ??= 1;
+  expect(1, cn?.nullableField);
+  expect(1, cn?.simpleNullableSetter ??= 2);
+  cn?.nullableField = null;
+  expect(2, cn?.simpleNullableSetter ??= 2);
+
+  new Class(-1).testInternal();
+
+  GenericClass<int> genericClass = new GenericClass<int>();
+  expect(1, GenericExtension(genericClass).setter = 1);
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline.expect
new file mode 100644
index 0000000..d0e8485
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline.expect
@@ -0,0 +1,29 @@
+class Class {
+  int field;
+  int? nullableField;
+  Class(this.field);
+}
+
+extension Extension on Class {
+  int get simpleSetter => field;
+  set simpleSetter(int value) {}
+  int? get simpleNullableSetter => nullableField;
+  set simpleNullableSetter(int? value) {}
+  int get mutatingSetter => field;
+  set mutatingSetter(int value) {}
+  int get setterWithReturn => field;
+  set setterWithReturn(int value) {}
+  int get setterWithClosure => field;
+  set setterWithClosure(int value) {}
+  testInternal() {}
+}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T> {
+  set setter(T value) {}
+}
+
+main() {}
+test(Class c, Class? cn) {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3b3923ee
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.textual_outline_modelled.expect
@@ -0,0 +1,30 @@
+class Class {
+  Class(this.field);
+  int? nullableField;
+  int field;
+}
+
+class GenericClass<T> {}
+
+expect(expected, actual) {}
+
+extension Extension on Class {
+  int? get simpleNullableSetter => nullableField;
+  int get mutatingSetter => field;
+  int get setterWithClosure => field;
+  int get setterWithReturn => field;
+  int get simpleSetter => field;
+  set mutatingSetter(int value) {}
+  set setterWithClosure(int value) {}
+  set setterWithReturn(int value) {}
+  set simpleNullableSetter(int? value) {}
+  set simpleSetter(int value) {}
+  testInternal() {}
+}
+
+extension GenericExtension<T> on GenericClass<T> {
+  set setter(T value) {}
+}
+
+main() {}
+test(Class c, Class? cn) {}
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.expect
new file mode 100644
index 0000000..e483e9c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.expect
@@ -0,0 +1,214 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  field core::int? nullableField = null;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get simpleSetter = self::Extension|get#simpleSetter;
+  get simpleNullableSetter = self::Extension|get#simpleNullableSetter;
+  get mutatingSetter = self::Extension|get#mutatingSetter;
+  get setterWithReturn = self::Extension|get#setterWithReturn;
+  get setterWithClosure = self::Extension|get#setterWithClosure;
+  method testInternal = self::Extension|testInternal;
+  tearoff testInternal = self::Extension|get#testInternal;
+  set simpleSetter = self::Extension|set#simpleSetter;
+  set simpleNullableSetter = self::Extension|set#simpleNullableSetter;
+  set mutatingSetter = self::Extension|set#mutatingSetter;
+  set setterWithReturn = self::Extension|set#setterWithReturn;
+  set setterWithClosure = self::Extension|set#setterWithClosure;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  set setter = self::GenericExtension|set#setter;
+}
+static method Extension|get#simpleSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#simpleSetter(lowered final self::Class #this, core::int value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#simpleNullableSetter(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::nullableField}{core::int?};
+static method Extension|set#simpleNullableSetter(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::nullableField} = value;
+}
+static method Extension|get#mutatingSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#mutatingSetter(lowered final self::Class #this, core::int value) → void {
+  value = value.{core::num::+}(1){(core::num) → core::int};
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithReturn(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithReturn(lowered final self::Class #this, core::int value) → void {
+  if(value.{core::num::<}(0){(core::num) → core::bool}) {
+    #this.{self::Class::field} = value.{core::int::unary-}(){() → core::int};
+    return;
+  }
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithClosure(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithClosure(lowered final self::Class #this, core::int value) → void {
+  function abs(dynamic value) → dynamic {
+    return value{dynamic}.<(0) as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool ?{dynamic} value{dynamic}.unary-() : value;
+  }
+  #this.{self::Class::field} = abs(value){(dynamic) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method Extension|testInternal(lowered final self::Class #this) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, #this.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(#this, 0);
+  self::expect(0, #this.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
+  self::Extension|set#mutatingSetter(#this, 0);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t7 = 4.{core::int::unary-}(){() → core::int} in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
+  self::expect(4, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t11 = 4.{core::int::unary-}(){() → core::int} in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
+  self::expect(4, #this.{self::Class::field}{core::int});
+}
+static method Extension|get#testInternal(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testInternal(#this);
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T% value) → void {}
+static method main() → dynamic {
+  self::Class c = new self::Class::•(1.{core::int::unary-}(){() → core::int});
+  self::test(c, c);
+}
+static method test(self::Class c, self::Class? cn) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, c.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t13 = 1 in let final void #t14 = self::Extension|set#simpleSetter(c, #t13) in #t13);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t15 = c in let final core::int #t16 = 3 in let final void #t17 = self::Extension|set#simpleSetter(#t15, #t16) in #t16);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t18 = 2 in let final void #t19 = self::Extension|set#mutatingSetter(c, #t18) in #t18);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t20 = c in let final core::int #t21 = 6 in let final void #t22 = self::Extension|set#mutatingSetter(#t20, #t21) in #t21);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t23 = 3 in let final void #t24 = self::Extension|set#setterWithReturn(c, #t23) in #t23);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t25 = 4.{core::int::unary-}(){() → core::int} in let final void #t26 = self::Extension|set#setterWithReturn(c, #t25) in #t25);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t27 = c in let final core::int #t28 = 7 in let final void #t29 = self::Extension|set#setterWithReturn(#t27, #t28) in #t28);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t30 = c in let final core::int #t31 = 8.{core::int::unary-}(){() → core::int} in let final void #t32 = self::Extension|set#setterWithReturn(#t30, #t31) in #t31);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t33 = 3 in let final void #t34 = self::Extension|set#setterWithClosure(c, #t33) in #t33);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t35 = 4.{core::int::unary-}(){() → core::int} in let final void #t36 = self::Extension|set#setterWithClosure(c, #t35) in #t35);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t37 = c in let final core::int #t38 = 7 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t40 = c in let final core::int #t41 = 8.{core::int::unary-}(){() → core::int} in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, let final self::Class? #t43 = cn in #t43 == null ?{core::int?} null : #t43{self::Class}.{self::Class::field}{core::int});
+  self::expect(1, let final self::Class? #t44 = cn in #t44 == null ?{core::int?} null : let final core::int #t45 = 1 in let final void #t46 = self::Extension|set#simpleSetter(#t44{self::Class}, #t45) in #t45);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, let final self::Class? #t47 = cn in #t47 == null ?{core::int?} null : #t47{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t48 = c in let final core::int #t49 = 3 in let final void #t50 = self::Extension|set#simpleSetter(#t48, #t49) in #t49);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, let final self::Class? #t51 = cn in #t51 == null ?{core::int?} null : #t51{self::Class}.{self::Class::field}{core::int});
+  self::expect(2, let final self::Class? #t52 = cn in #t52 == null ?{core::int?} null : let final core::int #t53 = 2 in let final void #t54 = self::Extension|set#mutatingSetter(#t52{self::Class}, #t53) in #t53);
+  self::expect(3, let final self::Class? #t55 = cn in #t55 == null ?{core::int?} null : #t55{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
+  self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
+  self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t69 = cn in #t69 == null ?{core::int?} null : let final core::int #t70 = 4.{core::int::unary-}(){() → core::int} in let final void #t71 = self::Extension|set#setterWithReturn(#t69{self::Class}, #t70) in #t70);
+  self::expect(4, let final self::Class? #t72 = cn in #t72 == null ?{core::int?} null : #t72{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, let final self::Class? #t73 = cn in #t73 == null ?{core::int?} null : #t73{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t74 = cn in #t74 == null ?{core::int?} null : #t74{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t75 = c in let final core::int #t76 = 7 in let final void #t77 = self::Extension|set#setterWithReturn(#t75, #t76) in #t76);
+  self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
+  self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
+  self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t91 = cn in #t91 == null ?{core::int?} null : let final core::int #t92 = 4.{core::int::unary-}(){() → core::int} in let final void #t93 = self::Extension|set#setterWithClosure(#t91{self::Class}, #t92) in #t92);
+  self::expect(4, let final self::Class? #t94 = cn in #t94 == null ?{core::int?} null : #t94{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, let final self::Class? #t95 = cn in #t95 == null ?{core::int?} null : #t95{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t96 = cn in #t96 == null ?{core::int?} null : #t96{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t97 = c in let final core::int #t98 = 7 in let final void #t99 = self::Extension|set#setterWithClosure(#t97, #t98) in #t98);
+  self::expect(7, let final self::Class? #t100 = cn in #t100 == null ?{core::int?} null : #t100{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t101 = c in let final core::int #t102 = 8.{core::int::unary-}(){() → core::int} in let final void #t103 = self::Extension|set#setterWithClosure(#t101, #t102) in #t102);
+  self::expect(8, let final self::Class? #t104 = cn in #t104 == null ?{core::int?} null : #t104{self::Class}.{self::Class::field}{core::int});
+  c.{self::Class::nullableField} = null;
+  let final self::Class #t105 = c in self::Extension|get#simpleNullableSetter(#t105) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t105, 1) : null;
+  self::expect(1, c.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class #t106 = c in let final core::int? #t107 = self::Extension|get#simpleNullableSetter(#t106) in #t107 == null ?{core::int} let final core::int #t108 = 2 in let final void #t109 = self::Extension|set#simpleNullableSetter(#t106, #t108) in #t108 : #t107{core::int});
+  c.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class #t110 = c in let final core::int? #t111 = self::Extension|get#simpleNullableSetter(#t110) in #t111 == null ?{core::int} let final core::int #t112 = 2 in let final void #t113 = self::Extension|set#simpleNullableSetter(#t110, #t112) in #t112 : #t111{core::int});
+  let final self::Class? #t114 = cn in #t114 == null ?{Null} null : #t114{self::Class}.{self::Class::nullableField} = null;
+  let final self::Class? #t115 = cn in #t115 == null ?{core::int?} null : self::Extension|get#simpleNullableSetter(#t115) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t115, 1) : null;
+  self::expect(1, let final self::Class? #t116 = cn in #t116 == null ?{core::int?} null : #t116{self::Class}.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class? #t117 = cn in #t117 == null ?{core::int?} null : let final core::int? #t118 = self::Extension|get#simpleNullableSetter(#t117) in #t118 == null ?{core::int} let final core::int #t119 = 2 in let final void #t120 = self::Extension|set#simpleNullableSetter(#t117, #t119) in #t119 : #t118{core::int});
+  let final self::Class? #t121 = cn in #t121 == null ?{Null} null : #t121{self::Class}.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class? #t122 = cn in #t122 == null ?{core::int?} null : let final core::int? #t123 = self::Extension|get#simpleNullableSetter(#t122) in #t123 == null ?{core::int} let final core::int #t124 = 2 in let final void #t125 = self::Extension|set#simpleNullableSetter(#t122, #t124) in #t124 : #t123{core::int});
+  self::Extension|testInternal(new self::Class::•(1.{core::int::unary-}(){() → core::int}));
+  self::GenericClass<core::int> genericClass = new self::GenericClass::•<core::int>();
+  self::expect(1, let final self::GenericClass<core::int> #t126 = genericClass in let final core::int #t127 = 1 in let final void #t128 = self::GenericExtension|set#setter<core::int>(#t126, #t127) in #t127);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.modular.expect
new file mode 100644
index 0000000..e483e9c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.modular.expect
@@ -0,0 +1,214 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  field core::int? nullableField = null;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get simpleSetter = self::Extension|get#simpleSetter;
+  get simpleNullableSetter = self::Extension|get#simpleNullableSetter;
+  get mutatingSetter = self::Extension|get#mutatingSetter;
+  get setterWithReturn = self::Extension|get#setterWithReturn;
+  get setterWithClosure = self::Extension|get#setterWithClosure;
+  method testInternal = self::Extension|testInternal;
+  tearoff testInternal = self::Extension|get#testInternal;
+  set simpleSetter = self::Extension|set#simpleSetter;
+  set simpleNullableSetter = self::Extension|set#simpleNullableSetter;
+  set mutatingSetter = self::Extension|set#mutatingSetter;
+  set setterWithReturn = self::Extension|set#setterWithReturn;
+  set setterWithClosure = self::Extension|set#setterWithClosure;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  set setter = self::GenericExtension|set#setter;
+}
+static method Extension|get#simpleSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#simpleSetter(lowered final self::Class #this, core::int value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#simpleNullableSetter(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::nullableField}{core::int?};
+static method Extension|set#simpleNullableSetter(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::nullableField} = value;
+}
+static method Extension|get#mutatingSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#mutatingSetter(lowered final self::Class #this, core::int value) → void {
+  value = value.{core::num::+}(1){(core::num) → core::int};
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithReturn(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithReturn(lowered final self::Class #this, core::int value) → void {
+  if(value.{core::num::<}(0){(core::num) → core::bool}) {
+    #this.{self::Class::field} = value.{core::int::unary-}(){() → core::int};
+    return;
+  }
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithClosure(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithClosure(lowered final self::Class #this, core::int value) → void {
+  function abs(dynamic value) → dynamic {
+    return value{dynamic}.<(0) as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool ?{dynamic} value{dynamic}.unary-() : value;
+  }
+  #this.{self::Class::field} = abs(value){(dynamic) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method Extension|testInternal(lowered final self::Class #this) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, #this.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(#this, 0);
+  self::expect(0, #this.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
+  self::Extension|set#mutatingSetter(#this, 0);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t7 = 4.{core::int::unary-}(){() → core::int} in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
+  self::expect(4, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t11 = 4.{core::int::unary-}(){() → core::int} in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
+  self::expect(4, #this.{self::Class::field}{core::int});
+}
+static method Extension|get#testInternal(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testInternal(#this);
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T% value) → void {}
+static method main() → dynamic {
+  self::Class c = new self::Class::•(1.{core::int::unary-}(){() → core::int});
+  self::test(c, c);
+}
+static method test(self::Class c, self::Class? cn) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, c.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t13 = 1 in let final void #t14 = self::Extension|set#simpleSetter(c, #t13) in #t13);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t15 = c in let final core::int #t16 = 3 in let final void #t17 = self::Extension|set#simpleSetter(#t15, #t16) in #t16);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t18 = 2 in let final void #t19 = self::Extension|set#mutatingSetter(c, #t18) in #t18);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t20 = c in let final core::int #t21 = 6 in let final void #t22 = self::Extension|set#mutatingSetter(#t20, #t21) in #t21);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t23 = 3 in let final void #t24 = self::Extension|set#setterWithReturn(c, #t23) in #t23);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t25 = 4.{core::int::unary-}(){() → core::int} in let final void #t26 = self::Extension|set#setterWithReturn(c, #t25) in #t25);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t27 = c in let final core::int #t28 = 7 in let final void #t29 = self::Extension|set#setterWithReturn(#t27, #t28) in #t28);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t30 = c in let final core::int #t31 = 8.{core::int::unary-}(){() → core::int} in let final void #t32 = self::Extension|set#setterWithReturn(#t30, #t31) in #t31);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t33 = 3 in let final void #t34 = self::Extension|set#setterWithClosure(c, #t33) in #t33);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t35 = 4.{core::int::unary-}(){() → core::int} in let final void #t36 = self::Extension|set#setterWithClosure(c, #t35) in #t35);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t37 = c in let final core::int #t38 = 7 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t40 = c in let final core::int #t41 = 8.{core::int::unary-}(){() → core::int} in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, let final self::Class? #t43 = cn in #t43 == null ?{core::int?} null : #t43{self::Class}.{self::Class::field}{core::int});
+  self::expect(1, let final self::Class? #t44 = cn in #t44 == null ?{core::int?} null : let final core::int #t45 = 1 in let final void #t46 = self::Extension|set#simpleSetter(#t44{self::Class}, #t45) in #t45);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, let final self::Class? #t47 = cn in #t47 == null ?{core::int?} null : #t47{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t48 = c in let final core::int #t49 = 3 in let final void #t50 = self::Extension|set#simpleSetter(#t48, #t49) in #t49);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, let final self::Class? #t51 = cn in #t51 == null ?{core::int?} null : #t51{self::Class}.{self::Class::field}{core::int});
+  self::expect(2, let final self::Class? #t52 = cn in #t52 == null ?{core::int?} null : let final core::int #t53 = 2 in let final void #t54 = self::Extension|set#mutatingSetter(#t52{self::Class}, #t53) in #t53);
+  self::expect(3, let final self::Class? #t55 = cn in #t55 == null ?{core::int?} null : #t55{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
+  self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
+  self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t69 = cn in #t69 == null ?{core::int?} null : let final core::int #t70 = 4.{core::int::unary-}(){() → core::int} in let final void #t71 = self::Extension|set#setterWithReturn(#t69{self::Class}, #t70) in #t70);
+  self::expect(4, let final self::Class? #t72 = cn in #t72 == null ?{core::int?} null : #t72{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, let final self::Class? #t73 = cn in #t73 == null ?{core::int?} null : #t73{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t74 = cn in #t74 == null ?{core::int?} null : #t74{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t75 = c in let final core::int #t76 = 7 in let final void #t77 = self::Extension|set#setterWithReturn(#t75, #t76) in #t76);
+  self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
+  self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
+  self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t91 = cn in #t91 == null ?{core::int?} null : let final core::int #t92 = 4.{core::int::unary-}(){() → core::int} in let final void #t93 = self::Extension|set#setterWithClosure(#t91{self::Class}, #t92) in #t92);
+  self::expect(4, let final self::Class? #t94 = cn in #t94 == null ?{core::int?} null : #t94{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, let final self::Class? #t95 = cn in #t95 == null ?{core::int?} null : #t95{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t96 = cn in #t96 == null ?{core::int?} null : #t96{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t97 = c in let final core::int #t98 = 7 in let final void #t99 = self::Extension|set#setterWithClosure(#t97, #t98) in #t98);
+  self::expect(7, let final self::Class? #t100 = cn in #t100 == null ?{core::int?} null : #t100{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t101 = c in let final core::int #t102 = 8.{core::int::unary-}(){() → core::int} in let final void #t103 = self::Extension|set#setterWithClosure(#t101, #t102) in #t102);
+  self::expect(8, let final self::Class? #t104 = cn in #t104 == null ?{core::int?} null : #t104{self::Class}.{self::Class::field}{core::int});
+  c.{self::Class::nullableField} = null;
+  let final self::Class #t105 = c in self::Extension|get#simpleNullableSetter(#t105) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t105, 1) : null;
+  self::expect(1, c.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class #t106 = c in let final core::int? #t107 = self::Extension|get#simpleNullableSetter(#t106) in #t107 == null ?{core::int} let final core::int #t108 = 2 in let final void #t109 = self::Extension|set#simpleNullableSetter(#t106, #t108) in #t108 : #t107{core::int});
+  c.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class #t110 = c in let final core::int? #t111 = self::Extension|get#simpleNullableSetter(#t110) in #t111 == null ?{core::int} let final core::int #t112 = 2 in let final void #t113 = self::Extension|set#simpleNullableSetter(#t110, #t112) in #t112 : #t111{core::int});
+  let final self::Class? #t114 = cn in #t114 == null ?{Null} null : #t114{self::Class}.{self::Class::nullableField} = null;
+  let final self::Class? #t115 = cn in #t115 == null ?{core::int?} null : self::Extension|get#simpleNullableSetter(#t115) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t115, 1) : null;
+  self::expect(1, let final self::Class? #t116 = cn in #t116 == null ?{core::int?} null : #t116{self::Class}.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class? #t117 = cn in #t117 == null ?{core::int?} null : let final core::int? #t118 = self::Extension|get#simpleNullableSetter(#t117) in #t118 == null ?{core::int} let final core::int #t119 = 2 in let final void #t120 = self::Extension|set#simpleNullableSetter(#t117, #t119) in #t119 : #t118{core::int});
+  let final self::Class? #t121 = cn in #t121 == null ?{Null} null : #t121{self::Class}.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class? #t122 = cn in #t122 == null ?{core::int?} null : let final core::int? #t123 = self::Extension|get#simpleNullableSetter(#t122) in #t123 == null ?{core::int} let final core::int #t124 = 2 in let final void #t125 = self::Extension|set#simpleNullableSetter(#t122, #t124) in #t124 : #t123{core::int});
+  self::Extension|testInternal(new self::Class::•(1.{core::int::unary-}(){() → core::int}));
+  self::GenericClass<core::int> genericClass = new self::GenericClass::•<core::int>();
+  self::expect(1, let final self::GenericClass<core::int> #t126 = genericClass in let final core::int #t127 = 1 in let final void #t128 = self::GenericExtension|set#setter<core::int>(#t126, #t127) in #t127);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.outline.expect
new file mode 100644
index 0000000..6c50707
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.outline.expect
@@ -0,0 +1,63 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  field core::int? nullableField;
+  constructor •(core::int field) → self::Class
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    ;
+}
+extension Extension on self::Class {
+  get simpleSetter = self::Extension|get#simpleSetter;
+  get simpleNullableSetter = self::Extension|get#simpleNullableSetter;
+  get mutatingSetter = self::Extension|get#mutatingSetter;
+  get setterWithReturn = self::Extension|get#setterWithReturn;
+  get setterWithClosure = self::Extension|get#setterWithClosure;
+  method testInternal = self::Extension|testInternal;
+  tearoff testInternal = self::Extension|get#testInternal;
+  set simpleSetter = self::Extension|set#simpleSetter;
+  set simpleNullableSetter = self::Extension|set#simpleNullableSetter;
+  set mutatingSetter = self::Extension|set#mutatingSetter;
+  set setterWithReturn = self::Extension|set#setterWithReturn;
+  set setterWithClosure = self::Extension|set#setterWithClosure;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  set setter = self::GenericExtension|set#setter;
+}
+static method Extension|get#simpleSetter(lowered final self::Class #this) → core::int
+  ;
+static method Extension|set#simpleSetter(lowered final self::Class #this, core::int value) → void
+  ;
+static method Extension|get#simpleNullableSetter(lowered final self::Class #this) → core::int?
+  ;
+static method Extension|set#simpleNullableSetter(lowered final self::Class #this, core::int? value) → void
+  ;
+static method Extension|get#mutatingSetter(lowered final self::Class #this) → core::int
+  ;
+static method Extension|set#mutatingSetter(lowered final self::Class #this, core::int value) → void
+  ;
+static method Extension|get#setterWithReturn(lowered final self::Class #this) → core::int
+  ;
+static method Extension|set#setterWithReturn(lowered final self::Class #this, core::int value) → void
+  ;
+static method Extension|get#setterWithClosure(lowered final self::Class #this) → core::int
+  ;
+static method Extension|set#setterWithClosure(lowered final self::Class #this, core::int value) → void
+  ;
+static method Extension|testInternal(lowered final self::Class #this) → dynamic
+  ;
+static method Extension|get#testInternal(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testInternal(#this);
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T% value) → void
+  ;
+static method main() → dynamic
+  ;
+static method test(self::Class c, self::Class? cn) → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.transformed.expect
new file mode 100644
index 0000000..651b8fc
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter2.dart.weak.transformed.expect
@@ -0,0 +1,322 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  field core::int? nullableField = null;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get simpleSetter = self::Extension|get#simpleSetter;
+  get simpleNullableSetter = self::Extension|get#simpleNullableSetter;
+  get mutatingSetter = self::Extension|get#mutatingSetter;
+  get setterWithReturn = self::Extension|get#setterWithReturn;
+  get setterWithClosure = self::Extension|get#setterWithClosure;
+  method testInternal = self::Extension|testInternal;
+  tearoff testInternal = self::Extension|get#testInternal;
+  set simpleSetter = self::Extension|set#simpleSetter;
+  set simpleNullableSetter = self::Extension|set#simpleNullableSetter;
+  set mutatingSetter = self::Extension|set#mutatingSetter;
+  set setterWithReturn = self::Extension|set#setterWithReturn;
+  set setterWithClosure = self::Extension|set#setterWithClosure;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  set setter = self::GenericExtension|set#setter;
+}
+static method Extension|get#simpleSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#simpleSetter(lowered final self::Class #this, core::int value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#simpleNullableSetter(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::nullableField}{core::int?};
+static method Extension|set#simpleNullableSetter(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::nullableField} = value;
+}
+static method Extension|get#mutatingSetter(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#mutatingSetter(lowered final self::Class #this, core::int value) → void {
+  value = value.{core::num::+}(1){(core::num) → core::int};
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithReturn(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithReturn(lowered final self::Class #this, core::int value) → void {
+  if(value.{core::num::<}(0){(core::num) → core::bool}) {
+    #this.{self::Class::field} = value.{core::int::unary-}(){() → core::int};
+    return;
+  }
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithClosure(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#setterWithClosure(lowered final self::Class #this, core::int value) → void {
+  function abs(dynamic value) → dynamic {
+    return value{dynamic}.<(0) as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool ?{dynamic} value{dynamic}.unary-() : value;
+  }
+  #this.{self::Class::field} = abs(value){(dynamic) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method Extension|testInternal(lowered final self::Class #this) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, #this.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(#this, 0);
+  self::expect(0, #this.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
+  self::Extension|set#mutatingSetter(#this, 0);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t7 = 4.{core::int::unary-}(){() → core::int} in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
+  self::expect(4, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, #this.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
+  self::expect(3, #this.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t11 = 4.{core::int::unary-}(){() → core::int} in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
+  self::expect(4, #this.{self::Class::field}{core::int});
+}
+static method Extension|get#testInternal(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testInternal(#this);
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T% value) → void {}
+static method main() → dynamic {
+  self::Class c = new self::Class::•(1.{core::int::unary-}(){() → core::int});
+  self::test(c, c);
+}
+static method test(self::Class c, self::Class? cn) → dynamic {
+  self::expect(1.{core::int::unary-}(){() → core::int}, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, c.{self::Class::field}{core::int});
+  self::expect(1, let final core::int #t13 = 1 in let final void #t14 = self::Extension|set#simpleSetter(c, #t13) in #t13);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t15 = c in let final core::int #t16 = 3 in let final void #t17 = self::Extension|set#simpleSetter(#t15, #t16) in #t16);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::expect(2, let final core::int #t18 = 2 in let final void #t19 = self::Extension|set#mutatingSetter(c, #t18) in #t18);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t20 = c in let final core::int #t21 = 6 in let final void #t22 = self::Extension|set#mutatingSetter(#t20, #t21) in #t21);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t23 = 3 in let final void #t24 = self::Extension|set#setterWithReturn(c, #t23) in #t23);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t25 = 4.{core::int::unary-}(){() → core::int} in let final void #t26 = self::Extension|set#setterWithReturn(c, #t25) in #t25);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t27 = c in let final core::int #t28 = 7 in let final void #t29 = self::Extension|set#setterWithReturn(#t27, #t28) in #t28);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t30 = c in let final core::int #t31 = 8.{core::int::unary-}(){() → core::int} in let final void #t32 = self::Extension|set#setterWithReturn(#t30, #t31) in #t31);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, c.{self::Class::field}{core::int});
+  self::expect(3, let final core::int #t33 = 3 in let final void #t34 = self::Extension|set#setterWithClosure(c, #t33) in #t33);
+  self::expect(3, c.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final core::int #t35 = 4.{core::int::unary-}(){() → core::int} in let final void #t36 = self::Extension|set#setterWithClosure(c, #t35) in #t35);
+  self::expect(4, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, c.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t37 = c in let final core::int #t38 = 7 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
+  self::expect(7, c.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t40 = c in let final core::int #t41 = 8.{core::int::unary-}(){() → core::int} in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
+  self::expect(8, c.{self::Class::field}{core::int});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, let final self::Class? #t43 = cn in #t43 == null ?{core::int?} null : #t43{self::Class}.{self::Class::field}{core::int});
+  self::expect(1, let final self::Class? #t44 = cn in #t44 == null ?{core::int?} null : let final core::int #t45 = 1 in let final void #t46 = self::Extension|set#simpleSetter(#t44{self::Class}, #t45) in #t45);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, let final self::Class? #t47 = cn in #t47 == null ?{core::int?} null : #t47{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class #t48 = c in let final core::int #t49 = 3 in let final void #t50 = self::Extension|set#simpleSetter(#t48, #t49) in #t49);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, let final self::Class? #t51 = cn in #t51 == null ?{core::int?} null : #t51{self::Class}.{self::Class::field}{core::int});
+  self::expect(2, let final self::Class? #t52 = cn in #t52 == null ?{core::int?} null : let final core::int #t53 = 2 in let final void #t54 = self::Extension|set#mutatingSetter(#t52{self::Class}, #t53) in #t53);
+  self::expect(3, let final self::Class? #t55 = cn in #t55 == null ?{core::int?} null : #t55{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
+  self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
+  self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
+  self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t69 = cn in #t69 == null ?{core::int?} null : let final core::int #t70 = 4.{core::int::unary-}(){() → core::int} in let final void #t71 = self::Extension|set#setterWithReturn(#t69{self::Class}, #t70) in #t70);
+  self::expect(4, let final self::Class? #t72 = cn in #t72 == null ?{core::int?} null : #t72{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, let final self::Class? #t73 = cn in #t73 == null ?{core::int?} null : #t73{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t74 = cn in #t74 == null ?{core::int?} null : #t74{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t75 = c in let final core::int #t76 = 7 in let final void #t77 = self::Extension|set#setterWithReturn(#t75, #t76) in #t76);
+  self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
+  self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
+  self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
+  self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
+  self::expect(4.{core::int::unary-}(){() → core::int}, let final self::Class? #t91 = cn in #t91 == null ?{core::int?} null : let final core::int #t92 = 4.{core::int::unary-}(){() → core::int} in let final void #t93 = self::Extension|set#setterWithClosure(#t91{self::Class}, #t92) in #t92);
+  self::expect(4, let final self::Class? #t94 = cn in #t94 == null ?{core::int?} null : #t94{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, let final self::Class? #t95 = cn in #t95 == null ?{core::int?} null : #t95{self::Class}.{self::Class::field}{core::int});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() → core::int});
+  self::expect(6, let final self::Class? #t96 = cn in #t96 == null ?{core::int?} null : #t96{self::Class}.{self::Class::field}{core::int});
+  self::expect(7, let final self::Class #t97 = c in let final core::int #t98 = 7 in let final void #t99 = self::Extension|set#setterWithClosure(#t97, #t98) in #t98);
+  self::expect(7, let final self::Class? #t100 = cn in #t100 == null ?{core::int?} null : #t100{self::Class}.{self::Class::field}{core::int});
+  self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t101 = c in let final core::int #t102 = 8.{core::int::unary-}(){() → core::int} in let final void #t103 = self::Extension|set#setterWithClosure(#t101, #t102) in #t102);
+  self::expect(8, let final self::Class? #t104 = cn in #t104 == null ?{core::int?} null : #t104{self::Class}.{self::Class::field}{core::int});
+  c.{self::Class::nullableField} = null;
+  let final self::Class #t105 = c in self::Extension|get#simpleNullableSetter(#t105) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t105, 1) : null;
+  self::expect(1, c.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class #t106 = c in let final core::int? #t107 = self::Extension|get#simpleNullableSetter(#t106) in #t107 == null ?{core::int} let final core::int #t108 = 2 in let final void #t109 = self::Extension|set#simpleNullableSetter(#t106, #t108) in #t108 : #t107{core::int});
+  c.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class #t110 = c in let final core::int? #t111 = self::Extension|get#simpleNullableSetter(#t110) in #t111 == null ?{core::int} let final core::int #t112 = 2 in let final void #t113 = self::Extension|set#simpleNullableSetter(#t110, #t112) in #t112 : #t111{core::int});
+  let final self::Class? #t114 = cn in #t114 == null ?{Null} null : #t114{self::Class}.{self::Class::nullableField} = null;
+  let final self::Class? #t115 = cn in #t115 == null ?{core::int?} null : self::Extension|get#simpleNullableSetter(#t115) == null ?{core::int} self::Extension|set#simpleNullableSetter(#t115, 1) : null;
+  self::expect(1, let final self::Class? #t116 = cn in #t116 == null ?{core::int?} null : #t116{self::Class}.{self::Class::nullableField}{core::int?});
+  self::expect(1, let final self::Class? #t117 = cn in #t117 == null ?{core::int?} null : let final core::int? #t118 = self::Extension|get#simpleNullableSetter(#t117) in #t118 == null ?{core::int} let final core::int #t119 = 2 in let final void #t120 = self::Extension|set#simpleNullableSetter(#t117, #t119) in #t119 : #t118{core::int});
+  let final self::Class? #t121 = cn in #t121 == null ?{Null} null : #t121{self::Class}.{self::Class::nullableField} = null;
+  self::expect(2, let final self::Class? #t122 = cn in #t122 == null ?{core::int?} null : let final core::int? #t123 = self::Extension|get#simpleNullableSetter(#t122) in #t123 == null ?{core::int} let final core::int #t124 = 2 in let final void #t125 = self::Extension|set#simpleNullableSetter(#t122, #t124) in #t124 : #t123{core::int});
+  self::Extension|testInternal(new self::Class::•(1.{core::int::unary-}(){() → core::int}));
+  self::GenericClass<core::int> genericClass = new self::GenericClass::•<core::int>();
+  self::expect(1, let final self::GenericClass<core::int> #t126 = genericClass in let final core::int #t127 = 1 in let final void #t128 = self::GenericExtension|set#setter<core::int>(#t126, #t127) in #t127);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+
+Extra constant evaluation status:
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:53:12 -> IntConstant(-1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:57:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:57:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:61:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:61:32 -> IntConstant(2)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:66:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:68:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:68:34 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:70:12 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:70:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:70:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:70:35 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:75:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:77:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:77:35 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:79:12 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:79:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:79:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:79:36 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:91:21 -> IntConstant(-1)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:96:10 -> IntConstant(-1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:100:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:100:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:103:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:103:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:107:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:107:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:111:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:111:43 -> IntConstant(6)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:116:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:118:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:118:34 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:120:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:120:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:120:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:120:35 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:124:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:126:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:126:45 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:128:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:128:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:128:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:128:46 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:133:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:135:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:135:35 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:137:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:137:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:137:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:137:36 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:141:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:143:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:143:46 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:145:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:145:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:145:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:145:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:150:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:150:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:153:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:153:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:157:34 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:157:34 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:161:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:161:43 -> IntConstant(6)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:166:26 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:168:36 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:168:36 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:170:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:170:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:170:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:170:37 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:174:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:176:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:176:45 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:178:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:178:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:178:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:178:46 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:183:27 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:185:37 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:185:37 -> IntConstant(3)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:187:10 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:187:38 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:187:38 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:187:38 -> IntConstant(-4)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:191:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:193:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:193:46 -> IntConstant(7)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:195:10 -> IntConstant(-8)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:195:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:195:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:195:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:201:40 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:201:40 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:203:40 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:203:40 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:208:42 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:208:42 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:210:42 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:210:42 -> IntConstant(2)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///extension_setter2.dart:212:13 -> IntConstant(-1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:215:53 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter2.dart:215:53 -> IntConstant(1)
+Extra constant evaluation: evaluated: 848, effectively constant: 104
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart b/pkg/front_end/testcases/extensions/extension_setter_error.dart
index a8b5d50..ffa19d7 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart
@@ -1,13 +1,15 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class GenericClass<T> {}
 
 extension GenericExtension<T> on GenericClass<T> {
-  set setter(T value) {}
+  set setter(T? value) {}
 }
 
+main() {}
+
 error() {
   GenericClass<int> genericClass = new GenericClass<int>();
   expect(null, GenericExtension<double>(genericClass).setter = null);
@@ -18,4 +20,4 @@
   if (expected != actual) {
     throw 'Mismatch: expected=$expected, actual=$actual';
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline.expect
index f98e6ac..ba70572 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline.expect
@@ -1,9 +1,9 @@
-// @dart = 2.9
 class GenericClass<T> {}
 
 extension GenericExtension<T> on GenericClass<T> {
-  set setter(T value) {}
+  set setter(T? value) {}
 }
 
+main() {}
 error() {}
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline_modelled.expect
index 282faec..1202e1e 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.textual_outline_modelled.expect
@@ -1,9 +1,10 @@
-// @dart = 2.9
 class GenericClass<T> {}
 
 error() {}
 expect(expected, actual) {}
 
 extension GenericExtension<T> on GenericClass<T> {
-  set setter(T value) {}
+  set setter(T? value) {}
 }
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.expect
index d2d6b51..0994723 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+// pkg/front_end/testcases/extensions/extension_setter_error.dart:15:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
 //   expect(null, GenericExtension<double>(genericClass).setter = null);
 //                                         ^
@@ -10,34 +10,25 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   set setter = self::GenericExtension|set#setter;
 }
-static method GenericExtension|set#setter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T*>* #this, self::GenericExtension|set#setter::T* value) → void {}
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T? value) → void {}
+static method main() → dynamic {}
 static method error() → dynamic {
-  self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
-  self::expect(null, let final self::GenericClass<core::int*>* #t1 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+  self::GenericClass<core::int> genericClass = new self::GenericClass::•<core::int>();
+  self::expect(null, let final self::GenericClass<core::int> #t1 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:15:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
   expect(null, GenericExtension<double>(genericClass).setter = null);
-                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final has-declared-initializer Null #t2 = null in let final void #t3 = self::GenericExtension|set#setter<core::double*>(#t1, #t2) in #t2);
+                                        ^" in genericClass as{TypeError,ForNonNullableByDefault} self::GenericClass<core::double> in let final has-declared-initializer Null #t2 = null in let final void #t3 = self::GenericExtension|set#setter<core::double>(#t1, #t2) in #t2);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect
index d2d6b51..0994723 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+// pkg/front_end/testcases/extensions/extension_setter_error.dart:15:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
 //  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
 //   expect(null, GenericExtension<double>(genericClass).setter = null);
 //                                         ^
@@ -10,34 +10,25 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   set setter = self::GenericExtension|set#setter;
 }
-static method GenericExtension|set#setter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T*>* #this, self::GenericExtension|set#setter::T* value) → void {}
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T? value) → void {}
+static method main() → dynamic {}
 static method error() → dynamic {
-  self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
-  self::expect(null, let final self::GenericClass<core::int*>* #t1 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+  self::GenericClass<core::int> genericClass = new self::GenericClass::•<core::int>();
+  self::expect(null, let final self::GenericClass<core::int> #t1 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:15:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
   expect(null, GenericExtension<double>(genericClass).setter = null);
-                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final has-declared-initializer Null #t2 = null in let final void #t3 = self::GenericExtension|set#setter<core::double*>(#t1, #t2) in #t2);
+                                        ^" in genericClass as{TypeError,ForNonNullableByDefault} self::GenericClass<core::double> in let final has-declared-initializer Null #t2 = null in let final void #t3 = self::GenericExtension|set#setter<core::double>(#t1, #t2) in #t2);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.outline.expect
index 2b0f430..3cd0642 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.outline.expect
@@ -1,25 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   set setter = self::GenericExtension|set#setter;
 }
-static method GenericExtension|set#setter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T*>* #this, self::GenericExtension|set#setter::T* value) → void
+static method GenericExtension|set#setter<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T%> #this, self::GenericExtension|set#setter::T? value) → void
+  ;
+static method main() → dynamic
   ;
 static method error() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart
index 60e02c6..e841612 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart
@@ -1,14 +1,14 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 /// Regression test for missing substitution of type variable used in the
 /// return type of a generic method on a generic extension.
 
 class Class<T> {}
 
 extension Extension<T> on Class<T> {
-  R method<R>(T t) => null;
+  R? method<R>(T t) => null;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline.expect
index 77c5035..1a6e56b 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline.expect
@@ -1,8 +1,7 @@
-// @dart = 2.9
 class Class<T> {}
 
 extension Extension<T> on Class<T> {
-  R method<R>(T t) => null;
+  R? method<R>(T t) => null;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline_modelled.expect
index 77c5035..1a6e56b 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.textual_outline_modelled.expect
@@ -1,8 +1,7 @@
-// @dart = 2.9
 class Class<T> {}
 
 extension Extension<T> on Class<T> {
-  R method<R>(T t) => null;
+  R? method<R>(T t) => null;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.expect
index 47243334..a1316a5 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.expect
@@ -1,30 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+static method Extension|method<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method::T%> #this, self::Extension|method::T% t) → self::Extension|method::R?
   return null;
-static method Extension|get#method<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
-  return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method Extension|get#method<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method::T%> #this) → <R extends core::Object? = dynamic>(self::Extension|get#method::T%) → R?
+  return <R extends core::Object? = dynamic>(self::Extension|get#method::T% t) → R? => self::Extension|method<self::Extension|get#method::T%, R%>(#this, t);
 static method main() → dynamic {
-  let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1 == null ?{core::String*} null : #t1.{core::Object::toString}(){() →* core::String*};
+  let final dynamic #t1 = self::Extension|method<core::int, dynamic>(new self::Class::•<core::int>(), 0) in #t1 == null ?{core::String?} null : #t1.{core::Object::toString}(){() → core::String};
 }
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect
index 47243334..a1316a5 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect
@@ -1,30 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+static method Extension|method<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method::T%> #this, self::Extension|method::T% t) → self::Extension|method::R?
   return null;
-static method Extension|get#method<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
-  return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method Extension|get#method<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method::T%> #this) → <R extends core::Object? = dynamic>(self::Extension|get#method::T%) → R?
+  return <R extends core::Object? = dynamic>(self::Extension|get#method::T% t) → R? => self::Extension|method<self::Extension|get#method::T%, R%>(#this, t);
 static method main() → dynamic {
-  let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1 == null ?{core::String*} null : #t1.{core::Object::toString}(){() →* core::String*};
+  let final dynamic #t1 = self::Extension|method<core::int, dynamic>(new self::Class::•<core::int>(), 0) in #t1 == null ?{core::String?} null : #t1.{core::Object::toString}(){() → core::String};
 }
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.outline.expect
index de2e8df..0d0d4d3 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.outline.expect
@@ -1,28 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+static method Extension|method<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method::T%> #this, self::Extension|method::T% t) → self::Extension|method::R?
   ;
-static method Extension|get#method<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
-  return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method Extension|get#method<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method::T%> #this) → <R extends core::Object? = dynamic>(self::Extension|get#method::T%) → R?
+  return <R extends core::Object? = dynamic>(self::Extension|get#method::T% t) → R? => self::Extension|method<self::Extension|get#method::T%, R%>(#this, t);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.transformed.expect
index 47243334..a1316a5 100644
--- a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.transformed.expect
@@ -1,30 +1,20 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+static method Extension|method<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method::T%> #this, self::Extension|method::T% t) → self::Extension|method::R?
   return null;
-static method Extension|get#method<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
-  return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method Extension|get#method<T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method::T%> #this) → <R extends core::Object? = dynamic>(self::Extension|get#method::T%) → R?
+  return <R extends core::Object? = dynamic>(self::Extension|get#method::T% t) → R? => self::Extension|method<self::Extension|get#method::T%, R%>(#this, t);
 static method main() → dynamic {
-  let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1 == null ?{core::String*} null : #t1.{core::Object::toString}(){() →* core::String*};
+  let final dynamic #t1 = self::Extension|method<core::int, dynamic>(new self::Class::•<core::int>(), 0) in #t1 == null ?{core::String?} null : #t1.{core::Object::toString}(){() → core::String};
 }
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart
index 95951cc..eb42294 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {
   int get m1 => 0;
   void set m2(int x) {}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline.expect
index 332dd6c..0207a05 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   int get m1 => 0;
   void set m2(int x) {}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline_modelled.expect
index 0d6d5d5..3da20ad 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {
   int get m1 => 0;
   void set m2(int x) {}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.expect
index 6666d8f..56494db 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -66,49 +66,39 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  get m1() → core::int*
+  get m1() → core::int
     return 0;
-  set m2(core::int* x) → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  set m2(core::int x) → void {}
 }
-extension Extension0 on self::Class* {
+extension Extension0 on self::Class {
   get m2 = self::Extension0|get#m2;
   get m4 = self::Extension0|get#m4;
   set m1 = self::Extension0|set#m1;
   set m3 = self::Extension0|set#m3;
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get m3 = self::Extension1|get#m3;
   set m4 = self::Extension1|set#m4;
 }
-static method Extension0|set#m1(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m2(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m1(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m2(lowered final self::Class #this) → core::int
   return 0;
-static method Extension0|set#m3(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m4(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m3(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m4(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|get#m3(lowered final self::Class* #this) → core::int*
+static method Extension1|get#m3(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|set#m4(lowered final self::Class* #this, core::int* x) → void {}
+static method Extension1|set#m4(lowered final self::Class #this, core::int x) → void {}
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  self::expect(0, c.{self::Class::m1}{core::int*});
+  self::Class c = new self::Class::•();
+  self::expect(0, c.{self::Class::m1}{core::int});
   c.{self::Class::m2} = 2;
 }
 static method errors() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(0, invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:30:15: Error: The getter 'm2' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm2'.
@@ -141,7 +131,7 @@
     ^^" in c{<unresolved>}.m4 = 2;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect
index 6666d8f..56494db 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -66,49 +66,39 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  get m1() → core::int*
+  get m1() → core::int
     return 0;
-  set m2(core::int* x) → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  set m2(core::int x) → void {}
 }
-extension Extension0 on self::Class* {
+extension Extension0 on self::Class {
   get m2 = self::Extension0|get#m2;
   get m4 = self::Extension0|get#m4;
   set m1 = self::Extension0|set#m1;
   set m3 = self::Extension0|set#m3;
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get m3 = self::Extension1|get#m3;
   set m4 = self::Extension1|set#m4;
 }
-static method Extension0|set#m1(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m2(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m1(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m2(lowered final self::Class #this) → core::int
   return 0;
-static method Extension0|set#m3(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m4(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m3(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m4(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|get#m3(lowered final self::Class* #this) → core::int*
+static method Extension1|get#m3(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|set#m4(lowered final self::Class* #this, core::int* x) → void {}
+static method Extension1|set#m4(lowered final self::Class #this, core::int x) → void {}
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  self::expect(0, c.{self::Class::m1}{core::int*});
+  self::Class c = new self::Class::•();
+  self::expect(0, c.{self::Class::m1}{core::int});
   c.{self::Class::m2} = 2;
 }
 static method errors() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(0, invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:30:15: Error: The getter 'm2' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm2'.
@@ -141,7 +131,7 @@
     ^^" in c{<unresolved>}.m4 = 2;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.outline.expect
index c1bc20e..57cb9b8 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.outline.expect
@@ -1,46 +1,36 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  get m1() → core::int*
+  get m1() → core::int
     ;
-  set m2(core::int* x) → void
+  set m2(core::int x) → void
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension0 on self::Class* {
+extension Extension0 on self::Class {
   get m2 = self::Extension0|get#m2;
   get m4 = self::Extension0|get#m4;
   set m1 = self::Extension0|set#m1;
   set m3 = self::Extension0|set#m3;
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get m3 = self::Extension1|get#m3;
   set m4 = self::Extension1|set#m4;
 }
-static method Extension0|set#m1(lowered final self::Class* #this, core::int* x) → void
+static method Extension0|set#m1(lowered final self::Class #this, core::int x) → void
   ;
-static method Extension0|get#m2(lowered final self::Class* #this) → core::int*
+static method Extension0|get#m2(lowered final self::Class #this) → core::int
   ;
-static method Extension0|set#m3(lowered final self::Class* #this, core::int* x) → void
+static method Extension0|set#m3(lowered final self::Class #this, core::int x) → void
   ;
-static method Extension0|get#m4(lowered final self::Class* #this) → core::int*
+static method Extension0|get#m4(lowered final self::Class #this) → core::int
   ;
-static method Extension1|get#m3(lowered final self::Class* #this) → core::int*
+static method Extension1|get#m3(lowered final self::Class #this) → core::int
   ;
-static method Extension1|set#m4(lowered final self::Class* #this, core::int* x) → void
+static method Extension1|set#m4(lowered final self::Class #this, core::int x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.transformed.expect
index 6666d8f..56494db 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -66,49 +66,39 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  get m1() → core::int*
+  get m1() → core::int
     return 0;
-  set m2(core::int* x) → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  set m2(core::int x) → void {}
 }
-extension Extension0 on self::Class* {
+extension Extension0 on self::Class {
   get m2 = self::Extension0|get#m2;
   get m4 = self::Extension0|get#m4;
   set m1 = self::Extension0|set#m1;
   set m3 = self::Extension0|set#m3;
 }
-extension Extension1 on self::Class* {
+extension Extension1 on self::Class {
   get m3 = self::Extension1|get#m3;
   set m4 = self::Extension1|set#m4;
 }
-static method Extension0|set#m1(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m2(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m1(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m2(lowered final self::Class #this) → core::int
   return 0;
-static method Extension0|set#m3(lowered final self::Class* #this, core::int* x) → void {}
-static method Extension0|get#m4(lowered final self::Class* #this) → core::int*
+static method Extension0|set#m3(lowered final self::Class #this, core::int x) → void {}
+static method Extension0|get#m4(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|get#m3(lowered final self::Class* #this) → core::int*
+static method Extension1|get#m3(lowered final self::Class #this) → core::int
   return 0;
-static method Extension1|set#m4(lowered final self::Class* #this, core::int* x) → void {}
+static method Extension1|set#m4(lowered final self::Class #this, core::int x) → void {}
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
-  self::expect(0, c.{self::Class::m1}{core::int*});
+  self::Class c = new self::Class::•();
+  self::expect(0, c.{self::Class::m1}{core::int});
   c.{self::Class::m2} = 2;
 }
 static method errors() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(0, invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:30:15: Error: The getter 'm2' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm2'.
@@ -141,7 +131,7 @@
     ^^" in c{<unresolved>}.m4 = 2;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/if_null.dart b/pkg/front_end/testcases/extensions/if_null.dart
index 68e54bb..0f0f4fb 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart
+++ b/pkg/front_end/testcases/extensions/if_null.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Class {
   int field;
 }
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/if_null.dart.weak.transformed.expect
index c98287f..d490043 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.weak.transformed.expect
@@ -50,10 +50,10 @@
 
 
 Extra constant evaluation status:
-Evaluated: Let @ org-dartlang-testcase:///if_null.dart:21:20 -> IntConstant(42)
-Evaluated: Let @ org-dartlang-testcase:///if_null.dart:22:31 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:23:18 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:23:18 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
+Evaluated: Let @ org-dartlang-testcase:///if_null.dart:23:20 -> IntConstant(42)
+Evaluated: Let @ org-dartlang-testcase:///if_null.dart:24:31 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:25:18 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:25:18 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:26:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:26:29 -> IntConstant(42)
 Extra constant evaluation: evaluated: 122, effectively constant: 6
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart b/pkg/front_end/testcases/extensions/if_null2.dart
new file mode 100644
index 0000000..56a0e71
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  int field;
+
+  Class(this.field);
+}
+
+extension Extension on Class {
+  int get property => field;
+  int? get nullableProperty => field;
+  void set property(int? value) {
+    field = value ?? 0;
+  }
+
+  int method() => field;
+}
+
+main() {
+  test(null);
+}
+
+int? get value => 42;
+
+test(Class? c) {
+  c?.property ?? 0;
+  Extension(c)?.property ?? 0;
+  c?.property = value ?? 0;
+  Extension(c)?.property = value ?? 0;
+  (c?.property = 42) ?? 0;
+  (Extension(c)?.property = value) ?? 0;
+  c?.method() ?? 0;
+  Extension(c)?.method() ?? 0;
+  c = new Class(0);
+  c.nullableProperty ?? 0;
+  Extension(c).nullableProperty ?? 0;
+}
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline.expect
new file mode 100644
index 0000000..b2e59a3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class Class {
+  int field;
+  Class(this.field);
+}
+
+extension Extension on Class {
+  int get property => field;
+  int? get nullableProperty => field;
+  void set property(int? value) {}
+  int method() => field;
+}
+
+main() {}
+int? get value => 42;
+test(Class? c) {}
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..303efbc
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class Class {
+  Class(this.field);
+  int field;
+}
+
+extension Extension on Class {
+  int? get nullableProperty => field;
+  int get property => field;
+  int method() => field;
+  void set property(int? value) {}
+}
+
+int? get value => 42;
+main() {}
+test(Class? c) {}
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.weak.expect b/pkg/front_end/testcases/extensions/if_null2.dart.weak.expect
new file mode 100644
index 0000000..4558359
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  get nullableProperty = self::Extension|get#nullableProperty;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#nullableProperty(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = let final core::int? #t1 = value in #t1 == null ?{core::int} 0 : #t1{core::int};
+}
+static method Extension|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
+static method main() → dynamic {
+  self::test(null);
+}
+static get value() → core::int?
+  return 42;
+static method test(self::Class? c) → dynamic {
+  let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
+  let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
+  let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
+  let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
+  let final core::int? #t18 = let final self::Class? #t19 = c in #t19 == null ?{core::int?} null : self::Extension|method(#t19{self::Class}) in #t18 == null ?{core::int} 0 : #t18{core::int};
+  let final core::int? #t20 = let final self::Class? #t21 = c in #t21 == null ?{core::int?} null : self::Extension|method(#t21{self::Class}) in #t20 == null ?{core::int} 0 : #t20{core::int};
+  c = new self::Class::•(0);
+  let final core::int? #t22 = self::Extension|get#nullableProperty(c{self::Class}) in #t22 == null ?{core::int} 0 : #t22{core::int};
+  let final core::int? #t23 = self::Extension|get#nullableProperty(c{self::Class}) in #t23 == null ?{core::int} 0 : #t23{core::int};
+}
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/if_null2.dart.weak.modular.expect
new file mode 100644
index 0000000..4558359
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  get nullableProperty = self::Extension|get#nullableProperty;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#nullableProperty(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = let final core::int? #t1 = value in #t1 == null ?{core::int} 0 : #t1{core::int};
+}
+static method Extension|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
+static method main() → dynamic {
+  self::test(null);
+}
+static get value() → core::int?
+  return 42;
+static method test(self::Class? c) → dynamic {
+  let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
+  let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
+  let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
+  let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
+  let final core::int? #t18 = let final self::Class? #t19 = c in #t19 == null ?{core::int?} null : self::Extension|method(#t19{self::Class}) in #t18 == null ?{core::int} 0 : #t18{core::int};
+  let final core::int? #t20 = let final self::Class? #t21 = c in #t21 == null ?{core::int?} null : self::Extension|method(#t21{self::Class}) in #t20 == null ?{core::int} 0 : #t20{core::int};
+  c = new self::Class::•(0);
+  let final core::int? #t22 = self::Extension|get#nullableProperty(c{self::Class}) in #t22 == null ?{core::int} 0 : #t22{core::int};
+  let final core::int? #t23 = self::Extension|get#nullableProperty(c{self::Class}) in #t23 == null ?{core::int} 0 : #t23{core::int};
+}
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/if_null2.dart.weak.outline.expect
new file mode 100644
index 0000000..7aeed31
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.weak.outline.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  get nullableProperty = self::Extension|get#nullableProperty;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int
+  ;
+static method Extension|get#nullableProperty(lowered final self::Class #this) → core::int?
+  ;
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void
+  ;
+static method Extension|method(lowered final self::Class #this) → core::int
+  ;
+static method Extension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
+static method main() → dynamic
+  ;
+static get value() → core::int?
+  ;
+static method test(self::Class? c) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/if_null2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/if_null2.dart.weak.transformed.expect
new file mode 100644
index 0000000..23f6b42
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null2.dart.weak.transformed.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  get nullableProperty = self::Extension|get#nullableProperty;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#nullableProperty(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = let final core::int? #t1 = value in #t1 == null ?{core::int} 0 : #t1{core::int};
+}
+static method Extension|method(lowered final self::Class #this) → core::int
+  return #this.{self::Class::field}{core::int};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|method(#this);
+static method main() → dynamic {
+  self::test(null);
+}
+static get value() → core::int?
+  return 42;
+static method test(self::Class? c) → dynamic {
+  let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
+  let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
+  let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
+  let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
+  let final core::int? #t18 = let final self::Class? #t19 = c in #t19 == null ?{core::int?} null : self::Extension|method(#t19{self::Class}) in #t18 == null ?{core::int} 0 : #t18{core::int};
+  let final core::int? #t20 = let final self::Class? #t21 = c in #t21 == null ?{core::int?} null : self::Extension|method(#t21{self::Class}) in #t20 == null ?{core::int} 0 : #t20{core::int};
+  c = new self::Class::•(0);
+  let final core::int? #t22 = self::Extension|get#nullableProperty(c{self::Class}) in #t22 == null ?{core::int} 0 : #t22{core::int};
+  let final core::int? #t23 = self::Extension|get#nullableProperty(c{self::Class}) in #t23 == null ?{core::int} 0 : #t23{core::int};
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null2.dart:32:18 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null2.dart:32:18 -> IntConstant(42)
+Extra constant evaluation: evaluated: 142, effectively constant: 2
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference.dart b/pkg/front_end/testcases/extensions/implicit_extension_inference.dart
index bc59f49..8f549e8 100644
--- a/pkg/front_end/testcases/extensions/implicit_extension_inference.dart
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class A {}
 class B extends A {}
 class C extends B {}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart
new file mode 100644
index 0000000..3c4a738
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T> {
+  T? get property => null;
+
+  T? method(T? t) => null;
+
+  S? genericMethod1<S>(S? s) => null;
+}
+
+main() {
+  A? aVariable;
+  B? bVariable;
+  C? cVariable;
+
+  GenericClass<A> aClass = new GenericClass<A>();
+  GenericClass<B> bClass = new GenericClass<B>();
+  GenericClass<C> cClass = new GenericClass<C>();
+
+  aVariable = aClass.property;
+  bVariable = bClass.property;
+  cVariable = cClass.property;
+
+  aVariable = aClass.method(aVariable);
+  bVariable = bClass.method(bVariable);
+  cVariable = cClass.method(cVariable);
+
+  cVariable = aClass.genericMethod1(cVariable);
+  aVariable = aClass.genericMethod1<A>(aVariable);
+  bVariable = aClass.genericMethod1<B>(bVariable);
+  cVariable = aClass.genericMethod1<C>(cVariable);
+
+  cVariable = bClass.genericMethod1(cVariable);
+  aVariable = bClass.genericMethod1<A>(cVariable);
+  bVariable = bClass.genericMethod1<B>(cVariable);
+  cVariable = bClass.genericMethod1<C>(cVariable);
+
+  cVariable = cClass.genericMethod1(cVariable);
+  aVariable = cClass.genericMethod1<A>(cVariable);
+  bVariable = cClass.genericMethod1<B>(cVariable);
+  cVariable = cClass.genericMethod1<C>(cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline.expect
new file mode 100644
index 0000000..56300ca
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T> {
+  T? get property => null;
+  T? method(T? t) => null;
+  S? genericMethod1<S>(S? s) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4d38882
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class GenericClass<T> {}
+
+extension GenericExtension<T> on GenericClass<T> {
+  S? genericMethod1<S>(S? s) => null;
+  T? get property => null;
+  T? method(T? t) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.expect
new file mode 100644
index 0000000..2c5e5d7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%> #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%> #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, bVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.modular.expect
new file mode 100644
index 0000000..2c5e5d7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%> #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%> #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, bVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.outline.expect
new file mode 100644
index 0000000..dc779ee
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.outline.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  ;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  ;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%> #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  ;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%> #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.transformed.expect
new file mode 100644
index 0000000..2c5e5d7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference2.dart.weak.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
+    : super core::Object::•()
+    ;
+}
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T%> #this) → self::GenericExtension|get#property::T?
+  return null;
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this, self::GenericExtension|method::T? t) → self::GenericExtension|method::T?
+  return null;
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → (self::GenericExtension|get#method::T?) → self::GenericExtension|get#method::T?
+  return (self::GenericExtension|get#method::T? t) → self::GenericExtension|get#method::T? => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T%> #this, self::GenericExtension|genericMethod1::S? s) → self::GenericExtension|genericMethod1::S?
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T%> #this) → <S extends core::Object? = dynamic>(S?) → S?
+  return <S extends core::Object? = dynamic>(S? s) → S? => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T%, S%>(#this, s);
+static method main() → dynamic {
+  self::A? aVariable;
+  self::B? bVariable;
+  self::C? cVariable;
+  self::GenericClass<self::A> aClass = new self::GenericClass::•<self::A>();
+  self::GenericClass<self::B> bClass = new self::GenericClass::•<self::B>();
+  self::GenericClass<self::C> cClass = new self::GenericClass::•<self::C>();
+  aVariable = self::GenericExtension|get#property<self::A>(aClass);
+  bVariable = self::GenericExtension|get#property<self::B>(bClass);
+  cVariable = self::GenericExtension|get#property<self::C>(cClass);
+  aVariable = self::GenericExtension|method<self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|method<self::B>(bClass, bVariable);
+  cVariable = self::GenericExtension|method<self::C>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::A, self::A>(aClass, aVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::A, self::B>(aClass, bVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::A, self::C>(aClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::B, self::A>(bClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::B, self::B>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::B, self::C>(bClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+  aVariable = self::GenericExtension|genericMethod1<self::C, self::A>(cClass, cVariable);
+  bVariable = self::GenericExtension|genericMethod1<self::C, self::B>(cClass, cVariable);
+  cVariable = self::GenericExtension|genericMethod1<self::C, self::C>(cClass, cVariable);
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart b/pkg/front_end/testcases/extensions/implicit_this.dart
index 12db6db9..b313805 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart
@@ -1,18 +1,18 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
   void method2() => method1();
 
-  Object method3() => field;
+  Object? method3() => field;
 
-  void method4(Object o) {
+  void method4(Object? o) {
     field = o;
   }
 }
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline.expect
index 50496bd..6281540 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline.expect
@@ -1,13 +1,12 @@
-// @dart = 2.9
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
   void method2() => method1();
-  Object method3() => field;
-  void method4(Object o) {}
+  Object? method3() => field;
+  void method4(Object? o) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline_modelled.expect
index f48f869..d3cdb67 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.textual_outline_modelled.expect
@@ -1,13 +1,12 @@
-// @dart = 2.9
 class A1 {
-  Object field;
+  Object? field;
   void method1() {}
 }
 
 extension A2 on A1 {
-  Object method3() => field;
+  Object? method3() => field;
   void method2() => method1();
-  void method4(Object o) {}
+  void method4(Object? o) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.expect
index 9328ef6..4c3c918 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object? o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object?) → void
+  return (core::Object? o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect
index 9328ef6..4c3c918 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object? o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object?) → void
+  return (core::Object? o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.outline.expect
index 21fa5c7..16c7c975 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.outline.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field;
-  synthetic constructor •() → self::A1*
+  field core::Object? field;
+  synthetic constructor •() → self::A1
     ;
   method method1() → void
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
+static method A2|method2(lowered final self::A1 #this) → void
   ;
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
+static method A2|method3(lowered final self::A1 #this) → core::Object?
   ;
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object? o) → void
   ;
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object?) → void
+  return (core::Object? o) → void => self::A2|method4(#this, o);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.transformed.expect
index 9328ef6..4c3c918 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.transformed.expect
@@ -1,25 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::Object* field = null;
-  synthetic constructor •() → self::A1*
+  field core::Object? field = null;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
   method method1() → void {}
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
   method method3 = self::A2|method3;
@@ -27,17 +17,17 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-static method A2|method2(lowered final self::A1* #this) → void
-  return #this.{self::A1::method1}(){() →* void};
-static method A2|get#method2(lowered final self::A1* #this) → () →* void
+static method A2|method2(lowered final self::A1 #this) → void
+  return #this.{self::A1::method1}(){() → void};
+static method A2|get#method2(lowered final self::A1 #this) → () → void
   return () → void => self::A2|method2(#this);
-static method A2|method3(lowered final self::A1* #this) → core::Object*
-  return #this.{self::A1::field}{core::Object*};
-static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
-  return () → core::Object* => self::A2|method3(#this);
-static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+static method A2|method3(lowered final self::A1 #this) → core::Object?
+  return #this.{self::A1::field}{core::Object?};
+static method A2|get#method3(lowered final self::A1 #this) → () → core::Object?
+  return () → core::Object? => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1 #this, core::Object? o) → void {
   #this.{self::A1::field} = o;
 }
-static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
-  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method A2|get#method4(lowered final self::A1 #this) → (core::Object?) → void
+  return (core::Object? o) → void => self::A2|method4(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart b/pkg/front_end/testcases/extensions/import_from_dill/main.dart
index 3c64e58..6524b05 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'main_lib1.dart';
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect
index 37f878a..b27adef 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'main_lib1.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect
index 37f878a..b27adef 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'main_lib1.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.expect
index 4dc6953..4b282dc 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib1.dart" as mai;
 import "dart:core" as core;
@@ -16,11 +16,11 @@
   #C2;
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as mai;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = mai::Extension|get#instanceProperty;
   method instanceMethod = mai::Extension|instanceMethod;
   tearoff instanceMethod = mai::Extension|get#instanceMethod;
@@ -32,18 +32,18 @@
   set instanceProperty = mai::Extension|set#instanceProperty;
   static set staticProperty = set mai::Extension|staticProperty;
 }
-static field core::int* Extension|staticField = 42;
-static final field core::int* Extension|staticFinalField = 42;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField = 42;
+static final field core::int Extension|staticFinalField = 42;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   return 42;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|instanceMethod(lowered final core::int* #this) → void {}
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void {}
+static method Extension|instanceMethod(lowered final core::int #this) → void {}
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => mai::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   return 42;
-static set Extension|staticProperty(core::int* value) → void {}
+static set Extension|staticProperty(core::int value) → void {}
 static method Extension|staticMethod() → void {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect
index 216ab75..04aa597 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib1.dart" as mai;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.outline.expect
index 71c7348..9e39c5f 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///main_lib1.dart";
@@ -6,11 +6,11 @@
 static method main() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = self2::Extension|get#instanceProperty;
   method instanceMethod = self2::Extension|instanceMethod;
   tearoff instanceMethod = self2::Extension|get#instanceMethod;
@@ -22,20 +22,20 @@
   set instanceProperty = self2::Extension|set#instanceProperty;
   static set staticProperty = set self2::Extension|staticProperty;
 }
-static field core::int* Extension|staticField;
-static final field core::int* Extension|staticFinalField;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField;
+static final field core::int Extension|staticFinalField;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   ;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void
   ;
-static method Extension|instanceMethod(lowered final core::int* #this) → void
+static method Extension|instanceMethod(lowered final core::int #this) → void
   ;
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => self2::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   ;
-static set Extension|staticProperty(core::int* value) → void
+static set Extension|staticProperty(core::int value) → void
   ;
 static method Extension|staticMethod() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.transformed.expect
index 4dc6953..4b282dc 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "main_lib1.dart" as mai;
 import "dart:core" as core;
@@ -16,11 +16,11 @@
   #C2;
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as mai;
 import "dart:core" as core;
 
-extension Extension on core::int* {
+extension Extension on core::int {
   get instanceProperty = mai::Extension|get#instanceProperty;
   method instanceMethod = mai::Extension|instanceMethod;
   tearoff instanceMethod = mai::Extension|get#instanceMethod;
@@ -32,18 +32,18 @@
   set instanceProperty = mai::Extension|set#instanceProperty;
   static set staticProperty = set mai::Extension|staticProperty;
 }
-static field core::int* Extension|staticField = 42;
-static final field core::int* Extension|staticFinalField = 42;
-static const field core::int* Extension|staticConstField = #C1;
-static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
+static field core::int Extension|staticField = 42;
+static final field core::int Extension|staticFinalField = 42;
+static const field core::int Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(lowered final core::int #this) → core::int
   return 42;
-static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void {}
-static method Extension|instanceMethod(lowered final core::int* #this) → void {}
-static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
+static method Extension|set#instanceProperty(lowered final core::int #this, core::int value) → void {}
+static method Extension|instanceMethod(lowered final core::int #this) → void {}
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → void
   return () → void => mai::Extension|instanceMethod(#this);
-static get Extension|staticProperty() → core::int*
+static get Extension|staticProperty() → core::int
   return 42;
-static set Extension|staticProperty(core::int* value) → void {}
+static set Extension|staticProperty(core::int value) → void {}
 static method Extension|staticMethod() → void {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart b/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart
index 4eba373..b08ae03 100644
--- a/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on int {
   int get instanceProperty => 42;
   void set instanceProperty(int value) {}
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart b/pkg/front_end/testcases/extensions/import_via_prefix.dart
index 859334a..a266734 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'import_via_prefix_lib.dart' as prefix;
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline.expect
index 493b461..b1848ace 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'import_via_prefix_lib.dart' as prefix;
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline_modelled.expect
index 60e4620..72ac1a4 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'import_via_prefix_lib.dart' as prefix;
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.expect
index 0b2f376..533f4cd 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "import_via_prefix_lib.dart" as imp;
 import "dart:core" as core;
@@ -9,19 +9,19 @@
   self::expect(3, imp::Extension|method("foo"));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as imp;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   method method = imp::Extension|method;
   tearoff method = imp::Extension|get#method;
 }
-static method Extension|method(lowered final core::String* #this) → core::int*
-  return #this.{core::String::length}{core::int*};
-static method Extension|get#method(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => imp::Extension|method(#this);
+static method Extension|method(lowered final core::String #this) → core::int
+  return #this.{core::String::length}{core::int};
+static method Extension|get#method(lowered final core::String #this) → () → core::int
+  return () → core::int => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect
index 0b2f376..533f4cd 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "import_via_prefix_lib.dart" as imp;
 import "dart:core" as core;
@@ -9,19 +9,19 @@
   self::expect(3, imp::Extension|method("foo"));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as imp;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   method method = imp::Extension|method;
   tearoff method = imp::Extension|get#method;
 }
-static method Extension|method(lowered final core::String* #this) → core::int*
-  return #this.{core::String::length}{core::int*};
-static method Extension|get#method(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => imp::Extension|method(#this);
+static method Extension|method(lowered final core::String #this) → core::int
+  return #this.{core::String::length}{core::int};
+static method Extension|get#method(lowered final core::String #this) → () → core::int
+  return () → core::int => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.outline.expect
index 920ce9c..68d8db6 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///import_via_prefix_lib.dart" as prefix;
@@ -8,15 +8,15 @@
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   method method = self2::Extension|method;
   tearoff method = self2::Extension|get#method;
 }
-static method Extension|method(lowered final core::String* #this) → core::int*
+static method Extension|method(lowered final core::String #this) → core::int
   ;
-static method Extension|get#method(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::Extension|method(#this);
+static method Extension|get#method(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.transformed.expect
index 0b2f376..533f4cd 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "import_via_prefix_lib.dart" as imp;
 import "dart:core" as core;
@@ -9,19 +9,19 @@
   self::expect(3, imp::Extension|method("foo"));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as imp;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   method method = imp::Extension|method;
   tearoff method = imp::Extension|get#method;
 }
-static method Extension|method(lowered final core::String* #this) → core::int*
-  return #this.{core::String::length}{core::int*};
-static method Extension|get#method(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => imp::Extension|method(#this);
+static method Extension|method(lowered final core::String #this) → core::int
+  return #this.{core::String::length}{core::int};
+static method Extension|get#method(lowered final core::String #this) → () → core::int
+  return () → core::int => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart b/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart
index 12a6894..a2f111a 100644
--- a/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart
+++ b/pkg/front_end/testcases/extensions/import_via_prefix_lib.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on String {
   int method() => length;
 }
diff --git a/pkg/front_end/testcases/extensions/index.dart b/pkg/front_end/testcases/extensions/index.dart
index c33cd60..ab0f01a 100644
--- a/pkg/front_end/testcases/extensions/index.dart
+++ b/pkg/front_end/testcases/extensions/index.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class MapLike<K, V> {
   final Map<K, V> _map = {};
 
diff --git a/pkg/front_end/testcases/extensions/index.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/index.dart.weak.transformed.expect
index 1b49a66..5741a4c 100644
--- a/pkg/front_end/testcases/extensions/index.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/index.dart.weak.transformed.expect
@@ -124,78 +124,78 @@
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:20 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:25 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:25 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:8 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:8 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:20 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:20 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:27 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:27 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:8 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:8 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:20 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:20 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:27 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:27 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:18 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:23 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:23 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:44:18 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:44:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:41:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:41:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:41:27 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:41:27 -> StringConstant("3")
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:18 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:23 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:23 -> IntConstant(1)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:46:18 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:46:18 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:20 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:20 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:60:49 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:60:49 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:32 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:32 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:44 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:44 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:51 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:51 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:32 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:44 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:44 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:51 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:51 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:72:44 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:72:44 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:73:39 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:73:39 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:39 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:47:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:47:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:70:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:70:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:70:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:70:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:44 -> IntConstant(1)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:75:39 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:75:39 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:41 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:41 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:89:36 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:89:36 -> StringConstant("2")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:19 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:19 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:31 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:31 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:38 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:38 -> StringConstant("4")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:19 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:19 -> IntConstant(2)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:31 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:31 -> IntConstant(3)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:38 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:38 -> StringConstant("3")
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:101:34 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:101:34 -> IntConstant(1)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:102:29 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:102:29 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:29 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:76:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:76:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:79:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:79:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:99:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:99:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:99:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:99:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:34 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:34 -> IntConstant(1)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:104:29 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:104:29 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
-Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:105:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:105:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:108:31 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:108:31 -> IntConstant(0)
 Extra constant evaluation: evaluated: 571, effectively constant: 74
diff --git a/pkg/front_end/testcases/extensions/index2.dart b/pkg/front_end/testcases/extensions/index2.dart
new file mode 100644
index 0000000..894f16a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class MapLike<K, V> {
+  final Map<K, V> _map = {};
+
+  V? get(Object key) => _map[key];
+  V put(K key, V value) => _map[key] = value;
+}
+
+extension Extension<K, V> on MapLike<K, V> {
+  V? operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+class MapLike2<K, V> {
+  final Map<K, V> _map = {};
+  final V defaultValue;
+
+  MapLike2(this.defaultValue);
+
+  V get(Object key) => _map[key] ?? defaultValue;
+  V put(K key, V value) => _map[key] = value;
+}
+
+extension Extension2<K, V> on MapLike2<K, V> {
+  V operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+main() {
+  implicit();
+  explicitWithTypeArguments();
+  explicitInferredTypeArguments();
+}
+
+implicit() {
+  MapLike<int, String> map1 = new MapLike();
+  expect(null, map1[0]);
+  map1.put(0, '0');
+  expect('0', map1[0]);
+  expect(null, map1[1]);
+  map1[1] = '1';
+  expect('1', map1[1]);
+  expect('2', map1[1] = '2');
+  expect('2', map1[1]);
+  map1[1] ??= '3';
+  expect('2', map1[1]);
+  expect('2', map1[1] ??= '4');
+  expect('2', map1[1]);
+  map1[2] ??= '2';
+  expect('2', map1[2]);
+  expect('3', map1[3] ??= '3');
+  expect('3', map1[3]);
+
+  MapLike2<int, int> map2 = new MapLike2(0);
+  expect(1, map2[0] = 1);
+  expect(3, map2[0] += 2);
+  expect(5, map2[0] += 2);
+  expect(5, map2[0]++);
+  expect(6, map2[0]);
+  expect(5, --map2[0]);
+  expect(5, map2[0]);
+}
+
+explicitWithTypeArguments() {
+  MapLike<int, String> map1 = new MapLike();
+  expect(null, Extension<int, String>(map1)[0]);
+  map1.put(0, '0');
+  expect('0', Extension<int, String>(map1)[0]);
+  expect(null, Extension<int, String>(map1)[1]);
+  Extension<int, String>(map1)[1] = '1';
+  expect('1', Extension<int, String>(map1)[1]);
+  expect('2', Extension<int, String>(map1)[1] = '2');
+  expect('2', Extension<int, String>(map1)[1]);
+  Extension<int, String>(map1)[1] ??= '3';
+  expect('2', Extension<int, String>(map1)[1]);
+  expect('2', Extension<int, String>(map1)[1] ??= '4');
+  expect('2', Extension<int, String>(map1)[1]);
+  Extension<int, String>(map1)[2] ??= '2';
+  expect('2', Extension<int, String>(map1)[2]);
+  expect('3', Extension<int, String>(map1)[3] ??= '3');
+  expect('3', Extension<int, String>(map1)[3]);
+
+  MapLike2<int, int> map2 = new MapLike2(0);
+  expect(1, Extension2<int, int>(map2)[0] = 1);
+  expect(3, Extension2<int, int>(map2)[0] += 2);
+  expect(5, Extension2<int, int>(map2)[0] += 2);
+  expect(5, Extension2<int, int>(map2)[0]++);
+  expect(6, Extension2<int, int>(map2)[0]);
+  expect(5, --Extension2<int, int>(map2)[0]);
+  expect(5, Extension2<int, int>(map2)[0]);
+}
+
+explicitInferredTypeArguments() {
+  MapLike<int, String> map1 = new MapLike();
+  expect(null, Extension(map1)[0]);
+  map1.put(0, '0');
+  expect('0', Extension(map1)[0]);
+  expect(null, Extension(map1)[1]);
+  Extension(map1)[1] = '1';
+  expect('1', Extension(map1)[1]);
+  expect('2', Extension(map1)[1] = '2');
+  expect('2', Extension(map1)[1]);
+  Extension(map1)[1] ??= '3';
+  expect('2', Extension(map1)[1]);
+  expect('2', Extension(map1)[1] ??= '4');
+  expect('2', Extension(map1)[1]);
+  Extension(map1)[2] ??= '2';
+  expect('2', Extension(map1)[2]);
+  expect('3', Extension(map1)[3] ??= '3');
+  expect('3', Extension(map1)[3]);
+
+  MapLike2<int, int> map2 = new MapLike2(0);
+  expect(1, Extension2(map2)[0] = 1);
+  expect(3, Extension2(map2)[0] += 2);
+  expect(5, Extension2(map2)[0] += 2);
+  expect(5, Extension2(map2)[0]++);
+  expect(6, Extension2(map2)[0]);
+  expect(5, --Extension2(map2)[0]);
+  expect(5, Extension2(map2)[0]);
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/index2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/index2.dart.textual_outline.expect
new file mode 100644
index 0000000..fcfebe2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.textual_outline.expect
@@ -0,0 +1,29 @@
+class MapLike<K, V> {
+  final Map<K, V> _map = {};
+  V? get(Object key) => _map[key];
+  V put(K key, V value) => _map[key] = value;
+}
+
+extension Extension<K, V> on MapLike<K, V> {
+  V? operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+class MapLike2<K, V> {
+  final Map<K, V> _map = {};
+  final V defaultValue;
+  MapLike2(this.defaultValue);
+  V get(Object key) => _map[key] ?? defaultValue;
+  V put(K key, V value) => _map[key] = value;
+}
+
+extension Extension2<K, V> on MapLike2<K, V> {
+  V operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+main() {}
+implicit() {}
+explicitWithTypeArguments() {}
+explicitInferredTypeArguments() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/index2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/index2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5dda1bd3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.textual_outline_modelled.expect
@@ -0,0 +1,30 @@
+class MapLike<K, V> {
+  V? get(Object key) => _map[key];
+  V put(K key, V value) => _map[key] = value;
+  final Map<K, V> _map = {};
+}
+
+class MapLike2<K, V> {
+  MapLike2(this.defaultValue);
+  V get(Object key) => _map[key] ?? defaultValue;
+  V put(K key, V value) => _map[key] = value;
+  final Map<K, V> _map = {};
+  final V defaultValue;
+}
+
+expect(expected, actual) {}
+explicitInferredTypeArguments() {}
+explicitWithTypeArguments() {}
+
+extension Extension<K, V> on MapLike<K, V> {
+  V? operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+extension Extension2<K, V> on MapLike2<K, V> {
+  V operator [](Object key) => get(key);
+  void operator []=(K key, V value) => put(key, value);
+}
+
+implicit() {}
+main() {}
diff --git a/pkg/front_end/testcases/extensions/index2.dart.weak.expect b/pkg/front_end/testcases/extensions/index2.dart.weak.expect
new file mode 100644
index 0000000..25a3f28
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.weak.expect
@@ -0,0 +1,132 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class MapLike<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike::K%, self::MapLike::V%> _map = <self::MapLike::K%, self::MapLike::V%>{};
+  synthetic constructor •() → self::MapLike<self::MapLike::K%, self::MapLike::V%>
+    : super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike::V?
+    return this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike::V?};
+  method put(covariant-by-class self::MapLike::K% key, covariant-by-class self::MapLike::V% value) → self::MapLike::V%
+    return let final core::Map<self::MapLike::K%, self::MapLike::V%> #t1 = this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>} in let final self::MapLike::K% #t2 = key in let final self::MapLike::V% #t3 = value in let final void #t4 = #t1.{core::Map::[]=}(#t2, #t3){(self::MapLike::K%, self::MapLike::V%) → void} in #t3;
+}
+class MapLike2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike2::K%, self::MapLike2::V%> _map = <self::MapLike2::K%, self::MapLike2::V%>{};
+  final field self::MapLike2::V% defaultValue;
+  constructor •(self::MapLike2::V% defaultValue) → self::MapLike2<self::MapLike2::K%, self::MapLike2::V%>
+    : self::MapLike2::defaultValue = defaultValue, super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike2::V%
+    return let final self::MapLike2::V? #t5 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike2::V?} in #t5 == null ?{self::MapLike2::V%} this.{self::MapLike2::defaultValue}{self::MapLike2::V%} : #t5{self::MapLike2::V% & core::Object /* '%' & '!' = '!' */};
+  method put(covariant-by-class self::MapLike2::K% key, covariant-by-class self::MapLike2::V% value) → self::MapLike2::V%
+    return let final core::Map<self::MapLike2::K%, self::MapLike2::V%> #t6 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>} in let final self::MapLike2::K% #t7 = key in let final self::MapLike2::V% #t8 = value in let final void #t9 = #t6.{core::Map::[]=}(#t7, #t8){(self::MapLike2::K%, self::MapLike2::V%) → void} in #t8;
+}
+extension Extension<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike<K%, V%> {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike2<K%, V%> {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static method Extension|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]::K%, self::Extension|[]::V%> #this, core::Object key) → self::Extension|[]::V?
+  return #this.{self::MapLike::get}(key){(core::Object) → self::Extension|[]::V?};
+static method Extension|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]=::K%, self::Extension|[]=::V%> #this, self::Extension|[]=::K% key, self::Extension|[]=::V% value) → void
+  return #this.{self::MapLike::put}(key, value){(self::Extension|[]=::K%, self::Extension|[]=::V%) → self::Extension|[]=::V%};
+static method Extension2|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]::K%, self::Extension2|[]::V%> #this, core::Object key) → self::Extension2|[]::V%
+  return #this.{self::MapLike2::get}(key){(core::Object) → self::Extension2|[]::V%};
+static method Extension2|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]=::K%, self::Extension2|[]=::V%> #this, self::Extension2|[]=::K% key, self::Extension2|[]=::V% value) → void
+  return #this.{self::MapLike2::put}(key, value){(self::Extension2|[]=::K%, self::Extension2|[]=::V%) → self::Extension2|[]=::V%};
+static method main() → dynamic {
+  self::implicit();
+  self::explicitWithTypeArguments();
+  self::explicitInferredTypeArguments();
+}
+static method implicit() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t10 = map1 in let final core::int #t11 = 1 in let final core::String #t12 = "2" in let final void #t13 = self::Extension|[]=<core::int, core::String>(#t10, #t11, #t12) in #t12);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t14 = map1 in let final core::int #t15 = 1 in self::Extension|[]<core::int, core::String>(#t14, #t15) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t14, #t15, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t16 = map1 in let final core::int #t17 = 1 in let final core::String? #t18 = self::Extension|[]<core::int, core::String>(#t16, #t17) in #t18 == null ?{core::String} let final core::String #t19 = "4" in let final void #t20 = self::Extension|[]=<core::int, core::String>(#t16, #t17, #t19) in #t19 : #t18{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t21 = map1 in let final core::int #t22 = 2 in self::Extension|[]<core::int, core::String>(#t21, #t22) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t21, #t22, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t23 = map1 in let final core::int #t24 = 3 in let final core::String? #t25 = self::Extension|[]<core::int, core::String>(#t23, #t24) in #t25 == null ?{core::String} let final core::String #t26 = "3" in let final void #t27 = self::Extension|[]=<core::int, core::String>(#t23, #t24, #t26) in #t26 : #t25{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t28 = map2 in let final core::int #t29 = 0 in let final core::int #t30 = 1 in let final void #t31 = self::Extension2|[]=<core::int, core::int>(#t28, #t29, #t30) in #t30);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t32 = map2 in let final core::int #t33 = 0 in let final core::int #t34 = self::Extension2|[]<core::int, core::int>(#t32, #t33).{core::num::+}(2){(core::num) → core::int} in let final void #t35 = self::Extension2|[]=<core::int, core::int>(#t32, #t33, #t34) in #t34);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t36 = map2 in let final core::int #t37 = 0 in let final core::int #t38 = self::Extension2|[]<core::int, core::int>(#t36, #t37).{core::num::+}(2){(core::num) → core::int} in let final void #t39 = self::Extension2|[]=<core::int, core::int>(#t36, #t37, #t38) in #t38);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t40 = map2 in let final core::int #t41 = 0 in let final core::int #t42 = self::Extension2|[]<core::int, core::int>(#t40, #t41) in let final void #t43 = self::Extension2|[]=<core::int, core::int>(#t40, #t41, #t42.{core::num::+}(1){(core::num) → core::int}) in #t42);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t44 = map2 in let final core::int #t45 = 0 in let final core::int #t46 = self::Extension2|[]<core::int, core::int>(#t44, #t45).{core::num::-}(1){(core::num) → core::int} in let final void #t47 = self::Extension2|[]=<core::int, core::int>(#t44, #t45, #t46) in #t46);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitWithTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t48 = map1 in let final core::String #t49 = "2" in let final void #t50 = self::Extension|[]=<core::int, core::String>(#t48, 1, #t49) in #t49);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t51 = map1 in let final core::int #t52 = 1 in self::Extension|[]<core::int, core::String>(#t51, #t52) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t51, #t52, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t53 = map1 in let final core::int #t54 = 1 in let final core::String? #t55 = self::Extension|[]<core::int, core::String>(#t53, #t54) in #t55 == null ?{core::String} let final core::String #t56 = "4" in let final void #t57 = self::Extension|[]=<core::int, core::String>(#t53, #t54, #t56) in #t56 : #t55{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t58 = map1 in let final core::int #t59 = 2 in self::Extension|[]<core::int, core::String>(#t58, #t59) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t58, #t59, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t60 = map1 in let final core::int #t61 = 3 in let final core::String? #t62 = self::Extension|[]<core::int, core::String>(#t60, #t61) in #t62 == null ?{core::String} let final core::String #t63 = "3" in let final void #t64 = self::Extension|[]=<core::int, core::String>(#t60, #t61, #t63) in #t63 : #t62{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t65 = map2 in let final core::int #t66 = 1 in let final void #t67 = self::Extension2|[]=<core::int, core::int>(#t65, 0, #t66) in #t66);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t68 = map2 in let final core::int #t69 = 0 in let final core::int #t70 = self::Extension2|[]<core::int, core::int>(#t68, #t69).{core::num::+}(2){(core::num) → core::int} in let final void #t71 = self::Extension2|[]=<core::int, core::int>(#t68, #t69, #t70) in #t70);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t72 = map2 in let final core::int #t73 = 0 in let final core::int #t74 = self::Extension2|[]<core::int, core::int>(#t72, #t73).{core::num::+}(2){(core::num) → core::int} in let final void #t75 = self::Extension2|[]=<core::int, core::int>(#t72, #t73, #t74) in #t74);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t76 = map2 in let final core::int #t77 = 0 in let final core::int #t78 = self::Extension2|[]<core::int, core::int>(#t76, #t77) in let final void #t79 = self::Extension2|[]=<core::int, core::int>(#t76, #t77, #t78.{core::num::+}(1){(core::num) → core::int}) in #t78);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t80 = map2 in let final core::int #t81 = 0 in let final core::int #t82 = self::Extension2|[]<core::int, core::int>(#t80, #t81).{core::num::-}(1){(core::num) → core::int} in let final void #t83 = self::Extension2|[]=<core::int, core::int>(#t80, #t81, #t82) in #t82);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitInferredTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t84 = map1 in let final core::String #t85 = "2" in let final void #t86 = self::Extension|[]=<core::int, core::String>(#t84, 1, #t85) in #t85);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t87 = map1 in let final core::int #t88 = 1 in self::Extension|[]<core::int, core::String>(#t87, #t88) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t87, #t88, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t89 = map1 in let final core::int #t90 = 1 in let final core::String? #t91 = self::Extension|[]<core::int, core::String>(#t89, #t90) in #t91 == null ?{core::String} let final core::String #t92 = "4" in let final void #t93 = self::Extension|[]=<core::int, core::String>(#t89, #t90, #t92) in #t92 : #t91{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t94 = map1 in let final core::int #t95 = 2 in self::Extension|[]<core::int, core::String>(#t94, #t95) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t94, #t95, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t96 = map1 in let final core::int #t97 = 3 in let final core::String? #t98 = self::Extension|[]<core::int, core::String>(#t96, #t97) in #t98 == null ?{core::String} let final core::String #t99 = "3" in let final void #t100 = self::Extension|[]=<core::int, core::String>(#t96, #t97, #t99) in #t99 : #t98{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t101 = map2 in let final core::int #t102 = 1 in let final void #t103 = self::Extension2|[]=<core::int, core::int>(#t101, 0, #t102) in #t102);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t104 = map2 in let final core::int #t105 = 0 in let final core::int #t106 = self::Extension2|[]<core::int, core::int>(#t104, #t105).{core::num::+}(2){(core::num) → core::int} in let final void #t107 = self::Extension2|[]=<core::int, core::int>(#t104, #t105, #t106) in #t106);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t108 = map2 in let final core::int #t109 = 0 in let final core::int #t110 = self::Extension2|[]<core::int, core::int>(#t108, #t109).{core::num::+}(2){(core::num) → core::int} in let final void #t111 = self::Extension2|[]=<core::int, core::int>(#t108, #t109, #t110) in #t110);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t112 = map2 in let final core::int #t113 = 0 in let final core::int #t114 = self::Extension2|[]<core::int, core::int>(#t112, #t113) in let final void #t115 = self::Extension2|[]=<core::int, core::int>(#t112, #t113, #t114.{core::num::+}(1){(core::num) → core::int}) in #t114);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t116 = map2 in let final core::int #t117 = 0 in let final core::int #t118 = self::Extension2|[]<core::int, core::int>(#t116, #t117).{core::num::-}(1){(core::num) → core::int} in let final void #t119 = self::Extension2|[]=<core::int, core::int>(#t116, #t117, #t118) in #t118);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/index2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/index2.dart.weak.modular.expect
new file mode 100644
index 0000000..25a3f28
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.weak.modular.expect
@@ -0,0 +1,132 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class MapLike<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike::K%, self::MapLike::V%> _map = <self::MapLike::K%, self::MapLike::V%>{};
+  synthetic constructor •() → self::MapLike<self::MapLike::K%, self::MapLike::V%>
+    : super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike::V?
+    return this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike::V?};
+  method put(covariant-by-class self::MapLike::K% key, covariant-by-class self::MapLike::V% value) → self::MapLike::V%
+    return let final core::Map<self::MapLike::K%, self::MapLike::V%> #t1 = this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>} in let final self::MapLike::K% #t2 = key in let final self::MapLike::V% #t3 = value in let final void #t4 = #t1.{core::Map::[]=}(#t2, #t3){(self::MapLike::K%, self::MapLike::V%) → void} in #t3;
+}
+class MapLike2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike2::K%, self::MapLike2::V%> _map = <self::MapLike2::K%, self::MapLike2::V%>{};
+  final field self::MapLike2::V% defaultValue;
+  constructor •(self::MapLike2::V% defaultValue) → self::MapLike2<self::MapLike2::K%, self::MapLike2::V%>
+    : self::MapLike2::defaultValue = defaultValue, super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike2::V%
+    return let final self::MapLike2::V? #t5 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike2::V?} in #t5 == null ?{self::MapLike2::V%} this.{self::MapLike2::defaultValue}{self::MapLike2::V%} : #t5{self::MapLike2::V% & core::Object /* '%' & '!' = '!' */};
+  method put(covariant-by-class self::MapLike2::K% key, covariant-by-class self::MapLike2::V% value) → self::MapLike2::V%
+    return let final core::Map<self::MapLike2::K%, self::MapLike2::V%> #t6 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>} in let final self::MapLike2::K% #t7 = key in let final self::MapLike2::V% #t8 = value in let final void #t9 = #t6.{core::Map::[]=}(#t7, #t8){(self::MapLike2::K%, self::MapLike2::V%) → void} in #t8;
+}
+extension Extension<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike<K%, V%> {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike2<K%, V%> {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static method Extension|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]::K%, self::Extension|[]::V%> #this, core::Object key) → self::Extension|[]::V?
+  return #this.{self::MapLike::get}(key){(core::Object) → self::Extension|[]::V?};
+static method Extension|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]=::K%, self::Extension|[]=::V%> #this, self::Extension|[]=::K% key, self::Extension|[]=::V% value) → void
+  return #this.{self::MapLike::put}(key, value){(self::Extension|[]=::K%, self::Extension|[]=::V%) → self::Extension|[]=::V%};
+static method Extension2|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]::K%, self::Extension2|[]::V%> #this, core::Object key) → self::Extension2|[]::V%
+  return #this.{self::MapLike2::get}(key){(core::Object) → self::Extension2|[]::V%};
+static method Extension2|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]=::K%, self::Extension2|[]=::V%> #this, self::Extension2|[]=::K% key, self::Extension2|[]=::V% value) → void
+  return #this.{self::MapLike2::put}(key, value){(self::Extension2|[]=::K%, self::Extension2|[]=::V%) → self::Extension2|[]=::V%};
+static method main() → dynamic {
+  self::implicit();
+  self::explicitWithTypeArguments();
+  self::explicitInferredTypeArguments();
+}
+static method implicit() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t10 = map1 in let final core::int #t11 = 1 in let final core::String #t12 = "2" in let final void #t13 = self::Extension|[]=<core::int, core::String>(#t10, #t11, #t12) in #t12);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t14 = map1 in let final core::int #t15 = 1 in self::Extension|[]<core::int, core::String>(#t14, #t15) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t14, #t15, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t16 = map1 in let final core::int #t17 = 1 in let final core::String? #t18 = self::Extension|[]<core::int, core::String>(#t16, #t17) in #t18 == null ?{core::String} let final core::String #t19 = "4" in let final void #t20 = self::Extension|[]=<core::int, core::String>(#t16, #t17, #t19) in #t19 : #t18{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t21 = map1 in let final core::int #t22 = 2 in self::Extension|[]<core::int, core::String>(#t21, #t22) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t21, #t22, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t23 = map1 in let final core::int #t24 = 3 in let final core::String? #t25 = self::Extension|[]<core::int, core::String>(#t23, #t24) in #t25 == null ?{core::String} let final core::String #t26 = "3" in let final void #t27 = self::Extension|[]=<core::int, core::String>(#t23, #t24, #t26) in #t26 : #t25{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t28 = map2 in let final core::int #t29 = 0 in let final core::int #t30 = 1 in let final void #t31 = self::Extension2|[]=<core::int, core::int>(#t28, #t29, #t30) in #t30);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t32 = map2 in let final core::int #t33 = 0 in let final core::int #t34 = self::Extension2|[]<core::int, core::int>(#t32, #t33).{core::num::+}(2){(core::num) → core::int} in let final void #t35 = self::Extension2|[]=<core::int, core::int>(#t32, #t33, #t34) in #t34);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t36 = map2 in let final core::int #t37 = 0 in let final core::int #t38 = self::Extension2|[]<core::int, core::int>(#t36, #t37).{core::num::+}(2){(core::num) → core::int} in let final void #t39 = self::Extension2|[]=<core::int, core::int>(#t36, #t37, #t38) in #t38);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t40 = map2 in let final core::int #t41 = 0 in let final core::int #t42 = self::Extension2|[]<core::int, core::int>(#t40, #t41) in let final void #t43 = self::Extension2|[]=<core::int, core::int>(#t40, #t41, #t42.{core::num::+}(1){(core::num) → core::int}) in #t42);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t44 = map2 in let final core::int #t45 = 0 in let final core::int #t46 = self::Extension2|[]<core::int, core::int>(#t44, #t45).{core::num::-}(1){(core::num) → core::int} in let final void #t47 = self::Extension2|[]=<core::int, core::int>(#t44, #t45, #t46) in #t46);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitWithTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t48 = map1 in let final core::String #t49 = "2" in let final void #t50 = self::Extension|[]=<core::int, core::String>(#t48, 1, #t49) in #t49);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t51 = map1 in let final core::int #t52 = 1 in self::Extension|[]<core::int, core::String>(#t51, #t52) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t51, #t52, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t53 = map1 in let final core::int #t54 = 1 in let final core::String? #t55 = self::Extension|[]<core::int, core::String>(#t53, #t54) in #t55 == null ?{core::String} let final core::String #t56 = "4" in let final void #t57 = self::Extension|[]=<core::int, core::String>(#t53, #t54, #t56) in #t56 : #t55{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t58 = map1 in let final core::int #t59 = 2 in self::Extension|[]<core::int, core::String>(#t58, #t59) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t58, #t59, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t60 = map1 in let final core::int #t61 = 3 in let final core::String? #t62 = self::Extension|[]<core::int, core::String>(#t60, #t61) in #t62 == null ?{core::String} let final core::String #t63 = "3" in let final void #t64 = self::Extension|[]=<core::int, core::String>(#t60, #t61, #t63) in #t63 : #t62{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t65 = map2 in let final core::int #t66 = 1 in let final void #t67 = self::Extension2|[]=<core::int, core::int>(#t65, 0, #t66) in #t66);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t68 = map2 in let final core::int #t69 = 0 in let final core::int #t70 = self::Extension2|[]<core::int, core::int>(#t68, #t69).{core::num::+}(2){(core::num) → core::int} in let final void #t71 = self::Extension2|[]=<core::int, core::int>(#t68, #t69, #t70) in #t70);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t72 = map2 in let final core::int #t73 = 0 in let final core::int #t74 = self::Extension2|[]<core::int, core::int>(#t72, #t73).{core::num::+}(2){(core::num) → core::int} in let final void #t75 = self::Extension2|[]=<core::int, core::int>(#t72, #t73, #t74) in #t74);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t76 = map2 in let final core::int #t77 = 0 in let final core::int #t78 = self::Extension2|[]<core::int, core::int>(#t76, #t77) in let final void #t79 = self::Extension2|[]=<core::int, core::int>(#t76, #t77, #t78.{core::num::+}(1){(core::num) → core::int}) in #t78);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t80 = map2 in let final core::int #t81 = 0 in let final core::int #t82 = self::Extension2|[]<core::int, core::int>(#t80, #t81).{core::num::-}(1){(core::num) → core::int} in let final void #t83 = self::Extension2|[]=<core::int, core::int>(#t80, #t81, #t82) in #t82);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitInferredTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t84 = map1 in let final core::String #t85 = "2" in let final void #t86 = self::Extension|[]=<core::int, core::String>(#t84, 1, #t85) in #t85);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t87 = map1 in let final core::int #t88 = 1 in self::Extension|[]<core::int, core::String>(#t87, #t88) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t87, #t88, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t89 = map1 in let final core::int #t90 = 1 in let final core::String? #t91 = self::Extension|[]<core::int, core::String>(#t89, #t90) in #t91 == null ?{core::String} let final core::String #t92 = "4" in let final void #t93 = self::Extension|[]=<core::int, core::String>(#t89, #t90, #t92) in #t92 : #t91{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t94 = map1 in let final core::int #t95 = 2 in self::Extension|[]<core::int, core::String>(#t94, #t95) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t94, #t95, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t96 = map1 in let final core::int #t97 = 3 in let final core::String? #t98 = self::Extension|[]<core::int, core::String>(#t96, #t97) in #t98 == null ?{core::String} let final core::String #t99 = "3" in let final void #t100 = self::Extension|[]=<core::int, core::String>(#t96, #t97, #t99) in #t99 : #t98{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t101 = map2 in let final core::int #t102 = 1 in let final void #t103 = self::Extension2|[]=<core::int, core::int>(#t101, 0, #t102) in #t102);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t104 = map2 in let final core::int #t105 = 0 in let final core::int #t106 = self::Extension2|[]<core::int, core::int>(#t104, #t105).{core::num::+}(2){(core::num) → core::int} in let final void #t107 = self::Extension2|[]=<core::int, core::int>(#t104, #t105, #t106) in #t106);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t108 = map2 in let final core::int #t109 = 0 in let final core::int #t110 = self::Extension2|[]<core::int, core::int>(#t108, #t109).{core::num::+}(2){(core::num) → core::int} in let final void #t111 = self::Extension2|[]=<core::int, core::int>(#t108, #t109, #t110) in #t110);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t112 = map2 in let final core::int #t113 = 0 in let final core::int #t114 = self::Extension2|[]<core::int, core::int>(#t112, #t113) in let final void #t115 = self::Extension2|[]=<core::int, core::int>(#t112, #t113, #t114.{core::num::+}(1){(core::num) → core::int}) in #t114);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t116 = map2 in let final core::int #t117 = 0 in let final core::int #t118 = self::Extension2|[]<core::int, core::int>(#t116, #t117).{core::num::-}(1){(core::num) → core::int} in let final void #t119 = self::Extension2|[]=<core::int, core::int>(#t116, #t117, #t118) in #t118);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/index2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/index2.dart.weak.outline.expect
new file mode 100644
index 0000000..3227a86
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.weak.outline.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class MapLike<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike::K%, self::MapLike::V%> _map;
+  synthetic constructor •() → self::MapLike<self::MapLike::K%, self::MapLike::V%>
+    ;
+  method get(core::Object key) → self::MapLike::V?
+    ;
+  method put(covariant-by-class self::MapLike::K% key, covariant-by-class self::MapLike::V% value) → self::MapLike::V%
+    ;
+}
+class MapLike2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike2::K%, self::MapLike2::V%> _map;
+  final field self::MapLike2::V% defaultValue;
+  constructor •(self::MapLike2::V% defaultValue) → self::MapLike2<self::MapLike2::K%, self::MapLike2::V%>
+    ;
+  method get(core::Object key) → self::MapLike2::V%
+    ;
+  method put(covariant-by-class self::MapLike2::K% key, covariant-by-class self::MapLike2::V% value) → self::MapLike2::V%
+    ;
+}
+extension Extension<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike<K%, V%> {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike2<K%, V%> {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static method Extension|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]::K%, self::Extension|[]::V%> #this, core::Object key) → self::Extension|[]::V?
+  ;
+static method Extension|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]=::K%, self::Extension|[]=::V%> #this, self::Extension|[]=::K% key, self::Extension|[]=::V% value) → void
+  ;
+static method Extension2|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]::K%, self::Extension2|[]::V%> #this, core::Object key) → self::Extension2|[]::V%
+  ;
+static method Extension2|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]=::K%, self::Extension2|[]=::V%> #this, self::Extension2|[]=::K% key, self::Extension2|[]=::V% value) → void
+  ;
+static method main() → dynamic
+  ;
+static method implicit() → dynamic
+  ;
+static method explicitWithTypeArguments() → dynamic
+  ;
+static method explicitInferredTypeArguments() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/index2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/index2.dart.weak.transformed.expect
new file mode 100644
index 0000000..57fee44
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index2.dart.weak.transformed.expect
@@ -0,0 +1,210 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class MapLike<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike::K%, self::MapLike::V%> _map = <self::MapLike::K%, self::MapLike::V%>{};
+  synthetic constructor •() → self::MapLike<self::MapLike::K%, self::MapLike::V%>
+    : super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike::V?
+    return this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike::V?};
+  method put(covariant-by-class self::MapLike::K% key, covariant-by-class self::MapLike::V% value) → self::MapLike::V%
+    return let final core::Map<self::MapLike::K%, self::MapLike::V%> #t1 = this.{self::MapLike::_map}{core::Map<self::MapLike::K%, self::MapLike::V%>} in let final self::MapLike::K% #t2 = key in let final self::MapLike::V% #t3 = value in let final void #t4 = #t1.{core::Map::[]=}(#t2, #t3){(self::MapLike::K%, self::MapLike::V%) → void} in #t3;
+}
+class MapLike2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field core::Map<self::MapLike2::K%, self::MapLike2::V%> _map = <self::MapLike2::K%, self::MapLike2::V%>{};
+  final field self::MapLike2::V% defaultValue;
+  constructor •(self::MapLike2::V% defaultValue) → self::MapLike2<self::MapLike2::K%, self::MapLike2::V%>
+    : self::MapLike2::defaultValue = defaultValue, super core::Object::•()
+    ;
+  method get(core::Object key) → self::MapLike2::V%
+    return let final self::MapLike2::V? #t5 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>}.{core::Map::[]}(key){(core::Object?) → self::MapLike2::V?} in #t5 == null ?{self::MapLike2::V%} this.{self::MapLike2::defaultValue}{self::MapLike2::V%} : #t5{self::MapLike2::V% & core::Object /* '%' & '!' = '!' */};
+  method put(covariant-by-class self::MapLike2::K% key, covariant-by-class self::MapLike2::V% value) → self::MapLike2::V%
+    return let final core::Map<self::MapLike2::K%, self::MapLike2::V%> #t6 = this.{self::MapLike2::_map}{core::Map<self::MapLike2::K%, self::MapLike2::V%>} in let final self::MapLike2::K% #t7 = key in let final self::MapLike2::V% #t8 = value in let final void #t9 = #t6.{core::Map::[]=}(#t7, #t8){(self::MapLike2::K%, self::MapLike2::V%) → void} in #t8;
+}
+extension Extension<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike<K%, V%> {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2<K extends core::Object? = dynamic, V extends core::Object? = dynamic> on self::MapLike2<K%, V%> {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static method Extension|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]::K%, self::Extension|[]::V%> #this, core::Object key) → self::Extension|[]::V?
+  return #this.{self::MapLike::get}(key){(core::Object) → self::Extension|[]::V?};
+static method Extension|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike<self::Extension|[]=::K%, self::Extension|[]=::V%> #this, self::Extension|[]=::K% key, self::Extension|[]=::V% value) → void
+  return #this.{self::MapLike::put}(key, value){(self::Extension|[]=::K%, self::Extension|[]=::V%) → self::Extension|[]=::V%};
+static method Extension2|[]<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]::K%, self::Extension2|[]::V%> #this, core::Object key) → self::Extension2|[]::V%
+  return #this.{self::MapLike2::get}(key){(core::Object) → self::Extension2|[]::V%};
+static method Extension2|[]=<K extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final self::MapLike2<self::Extension2|[]=::K%, self::Extension2|[]=::V%> #this, self::Extension2|[]=::K% key, self::Extension2|[]=::V% value) → void
+  return #this.{self::MapLike2::put}(key, value){(self::Extension2|[]=::K%, self::Extension2|[]=::V%) → self::Extension2|[]=::V%};
+static method main() → dynamic {
+  self::implicit();
+  self::explicitWithTypeArguments();
+  self::explicitInferredTypeArguments();
+}
+static method implicit() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t10 = map1 in let final core::int #t11 = 1 in let final core::String #t12 = "2" in let final void #t13 = self::Extension|[]=<core::int, core::String>(#t10, #t11, #t12) in #t12);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t14 = map1 in let final core::int #t15 = 1 in self::Extension|[]<core::int, core::String>(#t14, #t15) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t14, #t15, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t16 = map1 in let final core::int #t17 = 1 in let final core::String? #t18 = self::Extension|[]<core::int, core::String>(#t16, #t17) in #t18 == null ?{core::String} let final core::String #t19 = "4" in let final void #t20 = self::Extension|[]=<core::int, core::String>(#t16, #t17, #t19) in #t19 : #t18{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t21 = map1 in let final core::int #t22 = 2 in self::Extension|[]<core::int, core::String>(#t21, #t22) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t21, #t22, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t23 = map1 in let final core::int #t24 = 3 in let final core::String? #t25 = self::Extension|[]<core::int, core::String>(#t23, #t24) in #t25 == null ?{core::String} let final core::String #t26 = "3" in let final void #t27 = self::Extension|[]=<core::int, core::String>(#t23, #t24, #t26) in #t26 : #t25{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t28 = map2 in let final core::int #t29 = 0 in let final core::int #t30 = 1 in let final void #t31 = self::Extension2|[]=<core::int, core::int>(#t28, #t29, #t30) in #t30);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t32 = map2 in let final core::int #t33 = 0 in let final core::int #t34 = self::Extension2|[]<core::int, core::int>(#t32, #t33).{core::num::+}(2){(core::num) → core::int} in let final void #t35 = self::Extension2|[]=<core::int, core::int>(#t32, #t33, #t34) in #t34);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t36 = map2 in let final core::int #t37 = 0 in let final core::int #t38 = self::Extension2|[]<core::int, core::int>(#t36, #t37).{core::num::+}(2){(core::num) → core::int} in let final void #t39 = self::Extension2|[]=<core::int, core::int>(#t36, #t37, #t38) in #t38);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t40 = map2 in let final core::int #t41 = 0 in let final core::int #t42 = self::Extension2|[]<core::int, core::int>(#t40, #t41) in let final void #t43 = self::Extension2|[]=<core::int, core::int>(#t40, #t41, #t42.{core::num::+}(1){(core::num) → core::int}) in #t42);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t44 = map2 in let final core::int #t45 = 0 in let final core::int #t46 = self::Extension2|[]<core::int, core::int>(#t44, #t45).{core::num::-}(1){(core::num) → core::int} in let final void #t47 = self::Extension2|[]=<core::int, core::int>(#t44, #t45, #t46) in #t46);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitWithTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t48 = map1 in let final core::String #t49 = "2" in let final void #t50 = self::Extension|[]=<core::int, core::String>(#t48, 1, #t49) in #t49);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t51 = map1 in let final core::int #t52 = 1 in self::Extension|[]<core::int, core::String>(#t51, #t52) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t51, #t52, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t53 = map1 in let final core::int #t54 = 1 in let final core::String? #t55 = self::Extension|[]<core::int, core::String>(#t53, #t54) in #t55 == null ?{core::String} let final core::String #t56 = "4" in let final void #t57 = self::Extension|[]=<core::int, core::String>(#t53, #t54, #t56) in #t56 : #t55{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t58 = map1 in let final core::int #t59 = 2 in self::Extension|[]<core::int, core::String>(#t58, #t59) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t58, #t59, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t60 = map1 in let final core::int #t61 = 3 in let final core::String? #t62 = self::Extension|[]<core::int, core::String>(#t60, #t61) in #t62 == null ?{core::String} let final core::String #t63 = "3" in let final void #t64 = self::Extension|[]=<core::int, core::String>(#t60, #t61, #t63) in #t63 : #t62{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t65 = map2 in let final core::int #t66 = 1 in let final void #t67 = self::Extension2|[]=<core::int, core::int>(#t65, 0, #t66) in #t66);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t68 = map2 in let final core::int #t69 = 0 in let final core::int #t70 = self::Extension2|[]<core::int, core::int>(#t68, #t69).{core::num::+}(2){(core::num) → core::int} in let final void #t71 = self::Extension2|[]=<core::int, core::int>(#t68, #t69, #t70) in #t70);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t72 = map2 in let final core::int #t73 = 0 in let final core::int #t74 = self::Extension2|[]<core::int, core::int>(#t72, #t73).{core::num::+}(2){(core::num) → core::int} in let final void #t75 = self::Extension2|[]=<core::int, core::int>(#t72, #t73, #t74) in #t74);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t76 = map2 in let final core::int #t77 = 0 in let final core::int #t78 = self::Extension2|[]<core::int, core::int>(#t76, #t77) in let final void #t79 = self::Extension2|[]=<core::int, core::int>(#t76, #t77, #t78.{core::num::+}(1){(core::num) → core::int}) in #t78);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t80 = map2 in let final core::int #t81 = 0 in let final core::int #t82 = self::Extension2|[]<core::int, core::int>(#t80, #t81).{core::num::-}(1){(core::num) → core::int} in let final void #t83 = self::Extension2|[]=<core::int, core::int>(#t80, #t81, #t82) in #t82);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method explicitInferredTypeArguments() → dynamic {
+  self::MapLike<core::int, core::String> map1 = new self::MapLike::•<core::int, core::String>();
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int, core::String) → core::String};
+  self::expect("0", self::Extension|[]<core::int, core::String>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int, core::String>(map1, 1));
+  self::Extension|[]=<core::int, core::String>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t84 = map1 in let final core::String #t85 = "2" in let final void #t86 = self::Extension|[]=<core::int, core::String>(#t84, 1, #t85) in #t85);
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t87 = map1 in let final core::int #t88 = 1 in self::Extension|[]<core::int, core::String>(#t87, #t88) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t87, #t88, "3") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int, core::String> #t89 = map1 in let final core::int #t90 = 1 in let final core::String? #t91 = self::Extension|[]<core::int, core::String>(#t89, #t90) in #t91 == null ?{core::String} let final core::String #t92 = "4" in let final void #t93 = self::Extension|[]=<core::int, core::String>(#t89, #t90, #t92) in #t92 : #t91{core::String});
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 1));
+  let final self::MapLike<core::int, core::String> #t94 = map1 in let final core::int #t95 = 2 in self::Extension|[]<core::int, core::String>(#t94, #t95) == null ?{core::String} self::Extension|[]=<core::int, core::String>(#t94, #t95, "2") : null;
+  self::expect("2", self::Extension|[]<core::int, core::String>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int, core::String> #t96 = map1 in let final core::int #t97 = 3 in let final core::String? #t98 = self::Extension|[]<core::int, core::String>(#t96, #t97) in #t98 == null ?{core::String} let final core::String #t99 = "3" in let final void #t100 = self::Extension|[]=<core::int, core::String>(#t96, #t97, #t99) in #t99 : #t98{core::String});
+  self::expect("3", self::Extension|[]<core::int, core::String>(map1, 3));
+  self::MapLike2<core::int, core::int> map2 = new self::MapLike2::•<core::int, core::int>(0);
+  self::expect(1, let final self::MapLike2<core::int, core::int> #t101 = map2 in let final core::int #t102 = 1 in let final void #t103 = self::Extension2|[]=<core::int, core::int>(#t101, 0, #t102) in #t102);
+  self::expect(3, let final self::MapLike2<core::int, core::int> #t104 = map2 in let final core::int #t105 = 0 in let final core::int #t106 = self::Extension2|[]<core::int, core::int>(#t104, #t105).{core::num::+}(2){(core::num) → core::int} in let final void #t107 = self::Extension2|[]=<core::int, core::int>(#t104, #t105, #t106) in #t106);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t108 = map2 in let final core::int #t109 = 0 in let final core::int #t110 = self::Extension2|[]<core::int, core::int>(#t108, #t109).{core::num::+}(2){(core::num) → core::int} in let final void #t111 = self::Extension2|[]=<core::int, core::int>(#t108, #t109, #t110) in #t110);
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t112 = map2 in let final core::int #t113 = 0 in let final core::int #t114 = self::Extension2|[]<core::int, core::int>(#t112, #t113) in let final void #t115 = self::Extension2|[]=<core::int, core::int>(#t112, #t113, #t114.{core::num::+}(1){(core::num) → core::int}) in #t114);
+  self::expect(6, self::Extension2|[]<core::int, core::int>(map2, 0));
+  self::expect(5, let final self::MapLike2<core::int, core::int> #t116 = map2 in let final core::int #t117 = 0 in let final core::int #t118 = self::Extension2|[]<core::int, core::int>(#t116, #t117).{core::num::-}(1){(core::num) → core::int} in let final void #t119 = self::Extension2|[]=<core::int, core::int>(#t116, #t117, #t118) in #t118);
+  self::expect(5, self::Extension2|[]<core::int, core::int>(map2, 0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:46:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:46:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:46:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:48:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:48:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:50:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:50:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:50:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:50:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:52:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:52:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:54:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:54:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:54:27 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:54:27 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:58:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:58:23 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:58:23 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:59:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:59:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:60:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:60:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:61:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:61:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:63:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:63:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:75:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:75:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:77:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:77:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:79:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:79:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:79:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:79:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:81:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:81:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:83:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:83:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:83:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:83:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:87:45 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:87:45 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:88:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:88:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:89:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:89:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:90:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:90:40 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:92:42 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:92:42 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:104:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:104:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:106:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:106:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:108:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:108:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:108:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:108:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:110:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:110:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:112:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:112:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:112:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:112:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:116:35 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:116:35 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:117:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:117:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:118:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:118:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:119:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:119:30 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:121:32 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index2.dart:121:32 -> IntConstant(0)
+Extra constant evaluation: evaluated: 604, effectively constant: 74
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart b/pkg/front_end/testcases/extensions/instance_access.dart
index 6a2598d..7336e0f 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart
+++ b/pkg/front_end/testcases/extensions/instance_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class1 {
   int field;
 
@@ -23,7 +23,7 @@
     print('Extension1.method on $this');
     return field;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension1.genericMethod<$T>($t) on $this');
     return field + t;
   }
@@ -44,7 +44,7 @@
     print('Extension2.method on $this');
     return field + 3;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension2.genericMethod<$T>($t) on $this');
     return field + t + 4;
   }
@@ -60,22 +60,24 @@
 }
 
 main() {
-  testExtension1();
-  testExtension2();
+  Class1 c10 = new Class1(0);
+  Class1 c11 = new Class1(1);
+  testExtension1(c10, c11, c10, c11);
+  Class2 c20 = new Class2(0);
+  Class2 c21 = new Class2(1);
+  testExtension2(c20, c21, c20);
 }
 
-testExtension1() {
-  Class1 c0 = new Class1(0);
-  Class1 c1 = new Class1(1);
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {
   expect(0, c0.method());
   expect(1, c1.method());
-  expect(1, c1?.method());
+  expect(1, c1n?.method());
   expect(42, c0.genericMethod(42));
   expect(43, c0.genericMethod<num>(43));
   expect(88, c1.genericMethod(87));
   expect(89, c1.genericMethod<num>(88));
   expect(0, c0.property);
-  expect(0, c0?.property);
+  expect(0, c0n?.property);
   expect(42, c0.property = 42);
   expect(1, c1.property);
   expect(87, c0.property = 87);
@@ -85,18 +87,16 @@
   expect(67, c0.property = c1.property = c0.property = 67);
 }
 
-testExtension2() {
-  Class2 c0 = new Class2(0);
-  Class2 c1 = new Class2(1);
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {
   expect(3, c0.method());
-  expect(3, c0?.method());
+  expect(3, c0n?.method());
   expect(4, c1.method());
   expect(46, c0.genericMethod(42));
   expect(47, c0.genericMethod<num>(43));
   expect(92, c1.genericMethod(87));
   expect(93, c1.genericMethod<num>(88));
   expect(5, c0.property);
-  expect(5, c0?.property);
+  expect(5, c0n?.property);
   expect(42, c0.property = 42);
   expect(48, c0.property);
   expect(6, c1.property);
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline.expect
index b1a3aa6..a739e58 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   int field;
   Class1(this.field);
@@ -13,19 +12,19 @@
 
 extension Extension1 on Class1 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
   int get property {}
   set property(int value) {}
 }
 
 extension Extension2 on Class2 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
   int get property {}
   set property(int value) {}
 }
 
 main() {}
-testExtension1() {}
-testExtension2() {}
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {}
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {}
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline_modelled.expect
index 55a5670..796d226 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   Class1(this.field);
   String toString() => 'Class1($field)';
@@ -14,19 +13,19 @@
 expect(expected, actual) {}
 
 extension Extension1 on Class1 {
-  int genericMethod<T extends num>(T t) {}
   int get property {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
   set property(int value) {}
 }
 
 extension Extension2 on Class2 {
-  int genericMethod<T extends num>(T t) {}
   int get property {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
   set property(int value) {}
 }
 
 main() {}
-testExtension1() {}
-testExtension2() {}
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {}
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {}
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
index 215028e..8ddf7d9 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::Extension1|get#property;
   set property = self::Extension1|set#property;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
@@ -52,96 +34,96 @@
   get property = self::Extension2|get#property;
   set property = self::Extension2|set#property;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension1|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method Extension1|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
-static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static method Extension2|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method Extension2|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::Extension1|method(c0));
   self::expect(1, self::Extension1|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::Extension1|method(#t1));
-  self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::Extension1|method(#t1{self::Class1}));
+  self::expect(42, self::Extension1|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::Extension1|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::Extension1|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::Extension1|genericMethod<core::num>(c1, 88));
   self::expect(0, self::Extension1|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::Extension1|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::Extension1|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
   self::expect(1, self::Extension1|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::Extension2|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::Extension2|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::Extension2|method(#t27{self::Class2}));
   self::expect(4, self::Extension2|method(c1));
-  self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::Extension2|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::Extension2|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::Extension2|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::Extension2|genericMethod<core::num>(c1, 88));
   self::expect(5, self::Extension2|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::Extension2|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::Extension2|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
   self::expect(48, self::Extension2|get#property(c0));
   self::expect(6, self::Extension2|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
   self::expect(49, self::Extension2|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect
index 215028e..8ddf7d9 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::Extension1|get#property;
   set property = self::Extension1|set#property;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
@@ -52,96 +34,96 @@
   get property = self::Extension2|get#property;
   set property = self::Extension2|set#property;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension1|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method Extension1|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
-static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static method Extension2|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method Extension2|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::Extension1|method(c0));
   self::expect(1, self::Extension1|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::Extension1|method(#t1));
-  self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::Extension1|method(#t1{self::Class1}));
+  self::expect(42, self::Extension1|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::Extension1|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::Extension1|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::Extension1|genericMethod<core::num>(c1, 88));
   self::expect(0, self::Extension1|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::Extension1|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::Extension1|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
   self::expect(1, self::Extension1|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::Extension2|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::Extension2|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::Extension2|method(#t27{self::Class2}));
   self::expect(4, self::Extension2|method(c1));
-  self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::Extension2|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::Extension2|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::Extension2|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::Extension2|genericMethod<core::num>(c1, 88));
   self::expect(5, self::Extension2|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::Extension2|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::Extension2|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
   self::expect(48, self::Extension2|get#property(c0));
   self::expect(6, self::Extension2|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
   self::expect(49, self::Extension2|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
index 4e0c07a..e75ed74 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
@@ -1,40 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
@@ -42,7 +24,7 @@
   get property = self::Extension1|get#property;
   set property = self::Extension1|set#property;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
@@ -50,35 +32,35 @@
   get property = self::Extension2|get#property;
   set property = self::Extension2|set#property;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int*
+static method Extension1|method(lowered final self::Class1 #this) → core::int
   ;
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num
   ;
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension1|get#property(lowered final self::Class1* #this) → core::int*
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension1|get#property(lowered final self::Class1 #this) → core::int
   ;
-static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void
+static method Extension1|set#property(lowered final self::Class1 #this, core::int value) → void
   ;
-static method Extension2|method(lowered final self::Class2* #this) → core::int*
+static method Extension2|method(lowered final self::Class2 #this) → core::int
   ;
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num
   ;
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
-static method Extension2|get#property(lowered final self::Class2* #this) → core::int*
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static method Extension2|get#property(lowered final self::Class2 #this) → core::int
   ;
-static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void
+static method Extension2|set#property(lowered final self::Class2 #this, core::int value) → void
   ;
 static method main() → dynamic
   ;
-static method testExtension1() → dynamic
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic
   ;
-static method testExtension2() → dynamic
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
index a0cad7e..91a04f1 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::Extension1|get#property;
   set property = self::Extension1|set#property;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
@@ -52,116 +34,116 @@
   get property = self::Extension2|get#property;
   set property = self::Extension2|set#property;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension1|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method Extension1|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
-static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
+static method Extension2|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method Extension2|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::Extension1|method(c0));
   self::expect(1, self::Extension1|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::Extension1|method(#t1));
-  self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::Extension1|method(#t1{self::Class1}));
+  self::expect(42, self::Extension1|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::Extension1|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::Extension1|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::Extension1|genericMethod<core::num>(c1, 88));
   self::expect(0, self::Extension1|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::Extension1|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::Extension1|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
   self::expect(1, self::Extension1|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::Extension2|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::Extension2|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::Extension2|method(#t27{self::Class2}));
   self::expect(4, self::Extension2|method(c1));
-  self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::Extension2|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::Extension2|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::Extension2|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::Extension2|genericMethod<core::num>(c1, 88));
   self::expect(5, self::Extension2|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::Extension2|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::Extension2|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
   self::expect(48, self::Extension2|get#property(c0));
   self::expect(6, self::Extension2|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
   self::expect(49, self::Extension2|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:79:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:79:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:82:42 -> IntConstant(27)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:82:42 -> IntConstant(27)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:42 -> IntConstant(37)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:42 -> IntConstant(37)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:56 -> IntConstant(77)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:56 -> IntConstant(77)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:56 -> IntConstant(67)
-Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:86:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:86:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:87:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:87:56 -> IntConstant(67)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:100:28 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:100:28 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
-Extra constant evaluation: evaluated: 325, effectively constant: 16
+Extra constant evaluation: evaluated: 330, effectively constant: 16
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart b/pkg/front_end/testcases/extensions/instance_access_of_static.dart
index 5c06df4..10db47f 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class1 {
 }
 
@@ -10,8 +10,9 @@
     print('Extension1.staticMethod()');
   }
 
-  static get staticProperty {
+  static int get staticProperty {
     print('Extension1.staticProperty()');
+    return 0;
   }
   static set staticProperty(int value) {
     print('Extension1.staticProperty($value)');
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline.expect
index de48df1..34e9b92 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline.expect
@@ -1,9 +1,8 @@
-// @dart = 2.9
 class Class1 {}
 
 extension Extension1 on Class1 {
   static staticMethod() {}
-  static get staticProperty {}
+  static int get staticProperty {}
   static set staticProperty(int value) {}
   static var staticField = 42;
 }
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline_modelled.expect
index 61592f5..9f28a88 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.textual_outline_modelled.expect
@@ -1,8 +1,7 @@
-// @dart = 2.9
 class Class1 {}
 
 extension Extension1 on Class1 {
-  static get staticProperty {}
+  static int get staticProperty {}
   static set staticProperty(int value) {}
   static staticMethod() {}
   static var staticField = 42;
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.expect
index 1dadbb1..3dfab80 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.expect
@@ -1,38 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
 //   c.staticMethod();
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
 //   c.staticMethod;
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
 //   c.staticProperty;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
 //   c.staticProperty = 42;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
 //   c.staticField;
 //     ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
 //   c.staticField = 42;
@@ -42,65 +42,56 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   static method staticMethod = self::Extension1|staticMethod;
   static get staticProperty = get self::Extension1|staticProperty;
   static field staticField = self::Extension1|staticField;
   static set staticProperty = set self::Extension1|staticProperty;
 }
-static field core::int* Extension1|staticField = 42;
+static field core::int Extension1|staticField = 42;
 static method Extension1|staticMethod() → dynamic {
   core::print("Extension1.staticMethod()");
 }
-static get Extension1|staticProperty() → dynamic {
+static get Extension1|staticProperty() → core::int {
   core::print("Extension1.staticProperty()");
+  return 0;
 }
-static set Extension1|staticProperty(core::int* value) → void {
+static set Extension1|staticProperty(core::int value) → void {
   core::print("Extension1.staticProperty(${value})");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {
-  self::Class1* c = new self::Class1::•();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+  self::Class1 c = new self::Class1::•();
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
   c.staticMethod();
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
   c.staticMethod;
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
   c.staticProperty;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
   c.staticProperty = 42;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty = 42;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
   c.staticField;
     ^^^^^^^^^^^" in c{<unresolved>}.staticField;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
   c.staticField = 42;
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect
index 1dadbb1..3dfab80 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect
@@ -1,38 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
 //   c.staticMethod();
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
 //   c.staticMethod;
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
 //   c.staticProperty;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
 //   c.staticProperty = 42;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
 //   c.staticField;
 //     ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
 //   c.staticField = 42;
@@ -42,65 +42,56 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   static method staticMethod = self::Extension1|staticMethod;
   static get staticProperty = get self::Extension1|staticProperty;
   static field staticField = self::Extension1|staticField;
   static set staticProperty = set self::Extension1|staticProperty;
 }
-static field core::int* Extension1|staticField = 42;
+static field core::int Extension1|staticField = 42;
 static method Extension1|staticMethod() → dynamic {
   core::print("Extension1.staticMethod()");
 }
-static get Extension1|staticProperty() → dynamic {
+static get Extension1|staticProperty() → core::int {
   core::print("Extension1.staticProperty()");
+  return 0;
 }
-static set Extension1|staticProperty(core::int* value) → void {
+static set Extension1|staticProperty(core::int value) → void {
   core::print("Extension1.staticProperty(${value})");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {
-  self::Class1* c = new self::Class1::•();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+  self::Class1 c = new self::Class1::•();
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
   c.staticMethod();
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
   c.staticMethod;
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
   c.staticProperty;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
   c.staticProperty = 42;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty = 42;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
   c.staticField;
     ^^^^^^^^^^^" in c{<unresolved>}.staticField;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
   c.staticField = 42;
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.outline.expect
index e33cdbd..e3ee7d7 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.outline.expect
@@ -1,33 +1,23 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   static method staticMethod = self::Extension1|staticMethod;
   static get staticProperty = get self::Extension1|staticProperty;
   static field staticField = self::Extension1|staticField;
   static set staticProperty = set self::Extension1|staticProperty;
 }
-static field core::int* Extension1|staticField;
+static field core::int Extension1|staticField;
 static method Extension1|staticMethod() → dynamic
   ;
-static get Extension1|staticProperty() → dynamic
+static get Extension1|staticProperty() → core::int
   ;
-static set Extension1|staticProperty(core::int* value) → void
+static set Extension1|staticProperty(core::int value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.transformed.expect
index 1dadbb1..3dfab80 100644
--- a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.transformed.expect
@@ -1,38 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
 //   c.staticMethod();
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
 //   c.staticMethod;
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
 //   c.staticProperty;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
 //   c.staticProperty = 42;
 //     ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
 //   c.staticField;
 //     ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
 //  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
 //   c.staticField = 42;
@@ -42,65 +42,56 @@
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  synthetic constructor •() → self::Class1*
+  synthetic constructor •() → self::Class1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   static method staticMethod = self::Extension1|staticMethod;
   static get staticProperty = get self::Extension1|staticProperty;
   static field staticField = self::Extension1|staticField;
   static set staticProperty = set self::Extension1|staticProperty;
 }
-static field core::int* Extension1|staticField = 42;
+static field core::int Extension1|staticField = 42;
 static method Extension1|staticMethod() → dynamic {
   core::print("Extension1.staticMethod()");
 }
-static get Extension1|staticProperty() → dynamic {
+static get Extension1|staticProperty() → core::int {
   core::print("Extension1.staticProperty()");
+  return 0;
 }
-static set Extension1|staticProperty(core::int* value) → void {
+static set Extension1|staticProperty(core::int value) → void {
   core::print("Extension1.staticProperty(${value})");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {
-  self::Class1* c = new self::Class1::•();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+  self::Class1 c = new self::Class1::•();
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
   c.staticMethod();
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod();
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
   c.staticMethod;
     ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
   c.staticProperty;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
   c.staticProperty = 42;
     ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty = 42;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
   c.staticField;
     ^^^^^^^^^^^" in c{<unresolved>}.staticField;
-  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:32:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
   c.staticField = 42;
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart b/pkg/front_end/testcases/extensions/instance_members.dart
index 3792c5d..38b99d8 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart
+++ b/pkg/front_end/testcases/extensions/instance_members.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A1 {}
 
 extension A2 on A1 {
@@ -14,12 +14,12 @@
     return this;
   }
 
-  A1 method3<T>([T o]) {
+  A1 method3<T>([T? o]) {
     print(o);
     return this;
   }
 
-  A1 method4<T>({T o}) {
+  A1 method4<T>({T? o}) {
     print(o);
     return this;
   }
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline.expect
index 01b5f25..7049b62 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline.expect
@@ -1,11 +1,10 @@
-// @dart = 2.9
 class A1 {}
 
 extension A2 on A1 {
   A1 method1() {}
   A1 method2<T>(T o) {}
-  A1 method3<T>([T o]) {}
-  A1 method4<T>({T o}) {}
+  A1 method3<T>([T? o]) {}
+  A1 method4<T>({T? o}) {}
 }
 
 class B1<T> {}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline_modelled.expect
index ecc7423..34e212d 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A1 {}
 
 class B1<T> {}
@@ -6,8 +5,8 @@
 extension A2 on A1 {
   A1 method1() {}
   A1 method2<T>(T o) {}
-  A1 method3<T>([T o]) {}
-  A1 method4<T>({T o}) {}
+  A1 method3<T>([T? o]) {}
+  A1 method4<T>({T? o}) {}
 }
 
 extension B2<T> on B1<T> {
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_members.dart.weak.expect
index d189b6d..732d3c6 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.weak.expect
@@ -1,38 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
@@ -42,46 +22,46 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method A2|method3<T extends core::Object* = dynamic>(lowered final self::A1* #this, [self::A2|method3::T* o = #C1]) → self::A1* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method A2|method3<T extends core::Object? = dynamic>(lowered final self::A1 #this, [self::A2|method3::T? o = #C1]) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method3(lowered final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
-  return <T extends core::Object* = dynamic>([T* o = #C1]) → self::A1* => self::A2|method3<T*>(#this, o);
-static method A2|method4<T extends core::Object* = dynamic>(lowered final self::A1* #this, {self::A2|method4::T* o = #C1}) → self::A1* {
+static method A2|get#method3(lowered final self::A1 #this) → <T extends core::Object? = dynamic>([T?]) → self::A1
+  return <T extends core::Object? = dynamic>([T? o = #C1]) → self::A1 => self::A2|method3<T%>(#this, o);
+static method A2|method4<T extends core::Object? = dynamic>(lowered final self::A1 #this, {self::A2|method4::T? o = #C1}) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method4(lowered final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
-  return <T extends core::Object* = dynamic>({T* o = #C1}) → self::A1* => self::A2|method4<T*>(#this, o: o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method4(lowered final self::A1 #this) → <T extends core::Object? = dynamic>({o: T?}) → self::A1
+  return <T extends core::Object? = dynamic>({T? o = #C1}) → self::A1 => self::A2|method4<T%>(#this, o: o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect
index d189b6d..732d3c6 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect
@@ -1,38 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
@@ -42,46 +22,46 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method A2|method3<T extends core::Object* = dynamic>(lowered final self::A1* #this, [self::A2|method3::T* o = #C1]) → self::A1* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method A2|method3<T extends core::Object? = dynamic>(lowered final self::A1 #this, [self::A2|method3::T? o = #C1]) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method3(lowered final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
-  return <T extends core::Object* = dynamic>([T* o = #C1]) → self::A1* => self::A2|method3<T*>(#this, o);
-static method A2|method4<T extends core::Object* = dynamic>(lowered final self::A1* #this, {self::A2|method4::T* o = #C1}) → self::A1* {
+static method A2|get#method3(lowered final self::A1 #this) → <T extends core::Object? = dynamic>([T?]) → self::A1
+  return <T extends core::Object? = dynamic>([T? o = #C1]) → self::A1 => self::A2|method3<T%>(#this, o);
+static method A2|method4<T extends core::Object? = dynamic>(lowered final self::A1 #this, {self::A2|method4::T? o = #C1}) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method4(lowered final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
-  return <T extends core::Object* = dynamic>({T* o = #C1}) → self::A1* => self::A2|method4<T*>(#this, o: o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method4(lowered final self::A1 #this) → <T extends core::Object? = dynamic>({o: T?}) → self::A1
+  return <T extends core::Object? = dynamic>({T? o = #C1}) → self::A1 => self::A2|method4<T%>(#this, o: o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_members.dart.weak.outline.expect
index 63e9fce..a7decdd 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.weak.outline.expect
@@ -1,36 +1,16 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
@@ -40,35 +20,35 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1*
+static method A2|method1(lowered final self::A1 #this) → self::A1
   ;
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1*
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1
   ;
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method A2|method3<T extends core::Object* = dynamic>(lowered final self::A1* #this, [self::A2|method3::T* o]) → self::A1*
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method A2|method3<T extends core::Object? = dynamic>(lowered final self::A1 #this, [self::A2|method3::T? o]) → self::A1
   ;
-static method A2|get#method3(lowered final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
-  return <T extends core::Object* = dynamic>([T* o]) → self::A1* => self::A2|method3<T*>(#this, o);
-static method A2|method4<T extends core::Object* = dynamic>(lowered final self::A1* #this, {self::A2|method4::T* o}) → self::A1*
+static method A2|get#method3(lowered final self::A1 #this) → <T extends core::Object? = dynamic>([T?]) → self::A1
+  return <T extends core::Object? = dynamic>([T? o]) → self::A1 => self::A2|method3<T%>(#this, o);
+static method A2|method4<T extends core::Object? = dynamic>(lowered final self::A1 #this, {self::A2|method4::T? o}) → self::A1
   ;
-static method A2|get#method4(lowered final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
-  return <T extends core::Object* = dynamic>({T* o}) → self::A1* => self::A2|method4<T*>(#this, o: o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>*
+static method A2|get#method4(lowered final self::A1 #this) → <T extends core::Object? = dynamic>({o: T?}) → self::A1
+  return <T extends core::Object? = dynamic>({T? o}) → self::A1 => self::A2|method4<T%>(#this, o: o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%>
   ;
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>*
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%>
   ;
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_members.dart.weak.transformed.expect
index d189b6d..732d3c6 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.weak.transformed.expect
@@ -1,38 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
@@ -42,46 +22,46 @@
   method method4 = self::A2|method4;
   tearoff method4 = self::A2|get#method4;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method A2|method3<T extends core::Object* = dynamic>(lowered final self::A1* #this, [self::A2|method3::T* o = #C1]) → self::A1* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method A2|method3<T extends core::Object? = dynamic>(lowered final self::A1 #this, [self::A2|method3::T? o = #C1]) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method3(lowered final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
-  return <T extends core::Object* = dynamic>([T* o = #C1]) → self::A1* => self::A2|method3<T*>(#this, o);
-static method A2|method4<T extends core::Object* = dynamic>(lowered final self::A1* #this, {self::A2|method4::T* o = #C1}) → self::A1* {
+static method A2|get#method3(lowered final self::A1 #this) → <T extends core::Object? = dynamic>([T?]) → self::A1
+  return <T extends core::Object? = dynamic>([T? o = #C1]) → self::A1 => self::A2|method3<T%>(#this, o);
+static method A2|method4<T extends core::Object? = dynamic>(lowered final self::A1 #this, {self::A2|method4::T? o = #C1}) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method4(lowered final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
-  return <T extends core::Object* = dynamic>({T* o = #C1}) → self::A1* => self::A2|method4<T*>(#this, o: o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method4(lowered final self::A1 #this) → <T extends core::Object? = dynamic>({o: T?}) → self::A1
+  return <T extends core::Object? = dynamic>({T? o = #C1}) → self::A1 => self::A2|method4<T%>(#this, o: o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart b/pkg/front_end/testcases/extensions/instance_tearoff.dart
index edff3f7..6175790 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class1 {
   int field;
 
@@ -23,7 +23,7 @@
     print('Extension1.method on $this');
     return field;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension1.genericMethod<$T>($t) on $this');
     return field + t;
   }
@@ -35,7 +35,7 @@
     print('Extension2.method on $this');
     return field + 2;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension2.genericMethod<$T>($t) on $this');
     return field + t + 3;
   }
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline.expect
index 153e287..8e29444 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   int field;
   Class1(this.field);
@@ -13,12 +12,12 @@
 
 extension Extension1 on Class1 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
 }
 
 extension Extension2 on Class2 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline_modelled.expect
index e782f44..e9ddd5c 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   Class1(this.field);
   String toString() => 'Class1($field)';
@@ -14,13 +13,13 @@
 expect(expected, actual) {}
 
 extension Extension1 on Class1 {
-  int genericMethod<T extends num>(T t) {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
 }
 
 extension Extension2 on Class2 {
-  int genericMethod<T extends num>(T t) {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
index 1240994..17dee12 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
@@ -1,119 +1,101 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
   tearoff genericMethod = self::Extension1|get#genericMethod;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
   tearoff genericMethod = self::Extension2|get#genericMethod;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(2){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(2){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(3){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(3){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
   self::testExtension1();
   self::testExtension2();
 }
 static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
-  () →* core::int* tearOff0 = self::Extension1|get#method(c0);
-  self::expect(0, tearOff0(){() →* core::int*});
-  c0 = new self::Class1::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(0, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension1|get#method(c1);
-  self::expect(1, tearOff1(){() →* core::int*});
-  c1 = new self::Class1::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(1, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
-  self::expect(38, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
-  self::expect(35, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(35, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class1 c0 = new self::Class1::•(0);
+  self::Class1 c1 = new self::Class1::•(1);
+  () → core::int tearOff0 = self::Extension1|get#method(c0);
+  self::expect(0, tearOff0(){() → core::int});
+  c0 = new self::Class1::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(0, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension1|get#method(c1);
+  self::expect(1, tearOff1(){() → core::int});
+  c1 = new self::Class1::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(1, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  self::expect(38, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  self::expect(35, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(35, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
-  () →* core::int* tearOff0 = self::Extension2|get#method(c0);
-  self::expect(2, tearOff0(){() →* core::int*});
-  c0 = new self::Class2::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(2, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension2|get#method(c1);
-  self::expect(3, tearOff1(){() →* core::int*});
-  c1 = new self::Class2::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(3, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
-  self::expect(41, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(41, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
-  self::expect(38, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class2 c0 = new self::Class2::•(0);
+  self::Class2 c1 = new self::Class2::•(1);
+  () → core::int tearOff0 = self::Extension2|get#method(c0);
+  self::expect(2, tearOff0(){() → core::int});
+  c0 = new self::Class2::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(2, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension2|get#method(c1);
+  self::expect(3, tearOff1(){() → core::int});
+  c1 = new self::Class2::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(3, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  self::expect(41, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(41, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  self::expect(38, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect
index 1240994..17dee12 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect
@@ -1,119 +1,101 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
   tearoff genericMethod = self::Extension1|get#genericMethod;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
   tearoff genericMethod = self::Extension2|get#genericMethod;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(2){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(2){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(3){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(3){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
   self::testExtension1();
   self::testExtension2();
 }
 static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
-  () →* core::int* tearOff0 = self::Extension1|get#method(c0);
-  self::expect(0, tearOff0(){() →* core::int*});
-  c0 = new self::Class1::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(0, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension1|get#method(c1);
-  self::expect(1, tearOff1(){() →* core::int*});
-  c1 = new self::Class1::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(1, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
-  self::expect(38, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
-  self::expect(35, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(35, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class1 c0 = new self::Class1::•(0);
+  self::Class1 c1 = new self::Class1::•(1);
+  () → core::int tearOff0 = self::Extension1|get#method(c0);
+  self::expect(0, tearOff0(){() → core::int});
+  c0 = new self::Class1::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(0, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension1|get#method(c1);
+  self::expect(1, tearOff1(){() → core::int});
+  c1 = new self::Class1::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(1, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  self::expect(38, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  self::expect(35, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(35, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
-  () →* core::int* tearOff0 = self::Extension2|get#method(c0);
-  self::expect(2, tearOff0(){() →* core::int*});
-  c0 = new self::Class2::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(2, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension2|get#method(c1);
-  self::expect(3, tearOff1(){() →* core::int*});
-  c1 = new self::Class2::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(3, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
-  self::expect(41, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(41, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
-  self::expect(38, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class2 c0 = new self::Class2::•(0);
+  self::Class2 c1 = new self::Class2::•(1);
+  () → core::int tearOff0 = self::Extension2|get#method(c0);
+  self::expect(2, tearOff0(){() → core::int});
+  c0 = new self::Class2::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(2, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension2|get#method(c1);
+  self::expect(3, tearOff1(){() → core::int});
+  c1 = new self::Class2::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(3, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  self::expect(41, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(41, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  self::expect(38, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
index 8d3c1e7..dc03eea 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
@@ -1,67 +1,49 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
   tearoff genericMethod = self::Extension1|get#genericMethod;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
   tearoff genericMethod = self::Extension2|get#genericMethod;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int*
+static method Extension1|method(lowered final self::Class1 #this) → core::int
   ;
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num
   ;
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|method(lowered final self::Class2* #this) → core::int*
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|method(lowered final self::Class2 #this) → core::int
   ;
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num
   ;
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic
   ;
 static method testExtension1() → dynamic
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
index c14a689..1bf4f76 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
@@ -1,119 +1,101 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension Extension1 on self::Class1* {
+extension Extension1 on self::Class1 {
   method method = self::Extension1|method;
   tearoff method = self::Extension1|get#method;
   method genericMethod = self::Extension1|genericMethod;
   tearoff genericMethod = self::Extension1|get#genericMethod;
 }
-extension Extension2 on self::Class2* {
+extension Extension2 on self::Class2 {
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
   method genericMethod = self::Extension2|genericMethod;
   tearoff genericMethod = self::Extension2|get#genericMethod;
 }
-static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+static method Extension1|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::Extension1|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
-static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+static method Extension1|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension1|genericMethod<T>(#this, t);
+static method Extension2|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(2){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(2){(core::num) → core::int};
 }
-static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(3){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::Extension2|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(3){(core::num) → core::num};
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::Extension2|genericMethod<T>(#this, t);
 static method main() → dynamic {
   self::testExtension1();
   self::testExtension2();
 }
 static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
-  () →* core::int* tearOff0 = self::Extension1|get#method(c0);
-  self::expect(0, tearOff0(){() →* core::int*});
-  c0 = new self::Class1::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(0, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension1|get#method(c1);
-  self::expect(1, tearOff1(){() →* core::int*});
-  c1 = new self::Class1::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(1, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
-  self::expect(38, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
-  self::expect(35, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(35, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class1 c0 = new self::Class1::•(0);
+  self::Class1 c1 = new self::Class1::•(1);
+  () → core::int tearOff0 = self::Extension1|get#method(c0);
+  self::expect(0, tearOff0(){() → core::int});
+  c0 = new self::Class1::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(0, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension1|get#method(c1);
+  self::expect(1, tearOff1(){() → core::int});
+  c1 = new self::Class1::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(1, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  self::expect(38, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  self::expect(35, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(35, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
-  () →* core::int* tearOff0 = self::Extension2|get#method(c0);
-  self::expect(2, tearOff0(){() →* core::int*});
-  c0 = new self::Class2::•(4.{core::int::unary-}(){() →* core::int*});
-  self::expect(2, tearOff0(){() →* core::int*});
-  () →* core::int* tearOff1 = self::Extension2|get#method(c1);
-  self::expect(3, tearOff1(){() →* core::int*});
-  c1 = new self::Class2::•(7.{core::int::unary-}(){() →* core::int*});
-  self::expect(3, tearOff1(){() →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
-  self::expect(41, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(41, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
-  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
-  self::expect(38, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
-  self::expect(38, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+  self::Class2 c0 = new self::Class2::•(0);
+  self::Class2 c1 = new self::Class2::•(1);
+  () → core::int tearOff0 = self::Extension2|get#method(c0);
+  self::expect(2, tearOff0(){() → core::int});
+  c0 = new self::Class2::•(4.{core::int::unary-}(){() → core::int});
+  self::expect(2, tearOff0(){() → core::int});
+  () → core::int tearOff1 = self::Extension2|get#method(c1);
+  self::expect(3, tearOff1(){() → core::int});
+  c1 = new self::Class2::•(7.{core::int::unary-}(){() → core::int});
+  self::expect(3, tearOff1(){() → core::int});
+  <T extends core::num>(T) → core::num genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  self::expect(41, genericTearOff0<core::int>(42){(core::int) → core::num});
+  self::expect(41, genericTearOff0<core::num>(42){(core::num) → core::num});
+  <T extends core::num>(T) → core::num genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  self::expect(38, genericTearOff1<core::int>(42){(core::int) → core::num});
+  self::expect(38, genericTearOff1<core::num>(42){(core::num) → core::num});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
@@ -124,4 +106,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///instance_tearoff.dart:58:19 -> IntConstant(-7)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///instance_tearoff.dart:73:19 -> IntConstant(-4)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///instance_tearoff.dart:77:19 -> IntConstant(-7)
-Extra constant evaluation: evaluated: 144, effectively constant: 4
+Extra constant evaluation: evaluated: 142, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart b/pkg/front_end/testcases/extensions/internal_resolution.dart
index a6a36e9..796d36f 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart
@@ -1,19 +1,19 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {
-  int field;
+  int? field;
 }
 
 extension on Class {
-  int get property1 => property2;
-  void set property1(int value) => field = value;
+  int? get property1 => property2;
+  void set property1(int? value) => field = value;
 }
 
 extension on Class {
-  int get property2 => field;
-  void set property2(int value) => property1 = value;
+  int? get property2 => field;
+  void set property2(int? value) => property1 = value;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline.expect
index f8c5fde..b9bcd84 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline.expect
@@ -1,16 +1,15 @@
-// @dart = 2.9
 class Class {
-  int field;
+  int? field;
 }
 
 extension on Class {
-  int get property1 => property2;
-  void set property1(int value) => field = value;
+  int? get property1 => property2;
+  void set property1(int? value) => field = value;
 }
 
 extension on Class {
-  int get property2 => field;
-  void set property2(int value) => property1 = value;
+  int? get property2 => field;
+  void set property2(int? value) => property1 = value;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline_modelled.expect
index 44ba9bd..8ebb600 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.textual_outline_modelled.expect
@@ -1,18 +1,17 @@
-// @dart = 2.9
 class Class {
-  int field;
+  int? field;
 }
 
 expect(expected, actual) {}
 
 extension on Class {
-  int get property1 => property2;
-  void set property1(int value) => field = value;
+  int? get property1 => property2;
+  void set property1(int? value) => field = value;
 }
 
 extension on Class {
-  int get property2 => field;
-  void set property2(int value) => property1 = value;
+  int? get property2 => field;
+  void set property2(int? value) => property1 = value;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.expect
index 80f8e09..7a5b11f 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.expect
@@ -1,50 +1,40 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field = null;
-  synthetic constructor •() → self::Class*
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::Class* {
+extension _extension#0 on self::Class {
   get property1 = self::_extension#0|get#property1;
   set property1 = self::_extension#0|set#property1;
 }
-extension _extension#1 on self::Class* {
+extension _extension#1 on self::Class {
   get property2 = self::_extension#1|get#property2;
   set property2 = self::_extension#1|set#property2;
 }
-static method _extension#0|get#property1(lowered final self::Class* #this) → core::int*
+static method _extension#0|get#property1(lowered final self::Class #this) → core::int?
   return self::_extension#1|get#property2(#this);
-static method _extension#0|set#property1(lowered final self::Class* #this, core::int* value) → void
+static method _extension#0|set#property1(lowered final self::Class #this, core::int? value) → void
   return #this.{self::Class::field} = value;
-static method _extension#1|get#property2(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field}{core::int*};
-static method _extension#1|set#property2(lowered final self::Class* #this, core::int* value) → void
-  return let final core::int* #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
+static method _extension#1|get#property2(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method _extension#1|set#property2(lowered final self::Class #this, core::int? value) → void
+  return let final core::int? #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(null, self::_extension#0|get#property1(c));
   self::expect(null, self::_extension#1|get#property2(c));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
   self::expect(42, self::_extension#1|get#property2(c));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
   self::expect(87, self::_extension#0|get#property1(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect
index 80f8e09..7a5b11f 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect
@@ -1,50 +1,40 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field = null;
-  synthetic constructor •() → self::Class*
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::Class* {
+extension _extension#0 on self::Class {
   get property1 = self::_extension#0|get#property1;
   set property1 = self::_extension#0|set#property1;
 }
-extension _extension#1 on self::Class* {
+extension _extension#1 on self::Class {
   get property2 = self::_extension#1|get#property2;
   set property2 = self::_extension#1|set#property2;
 }
-static method _extension#0|get#property1(lowered final self::Class* #this) → core::int*
+static method _extension#0|get#property1(lowered final self::Class #this) → core::int?
   return self::_extension#1|get#property2(#this);
-static method _extension#0|set#property1(lowered final self::Class* #this, core::int* value) → void
+static method _extension#0|set#property1(lowered final self::Class #this, core::int? value) → void
   return #this.{self::Class::field} = value;
-static method _extension#1|get#property2(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field}{core::int*};
-static method _extension#1|set#property2(lowered final self::Class* #this, core::int* value) → void
-  return let final core::int* #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
+static method _extension#1|get#property2(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method _extension#1|set#property2(lowered final self::Class #this, core::int? value) → void
+  return let final core::int? #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(null, self::_extension#0|get#property1(c));
   self::expect(null, self::_extension#1|get#property2(c));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
   self::expect(42, self::_extension#1|get#property2(c));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
   self::expect(87, self::_extension#0|get#property1(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.outline.expect
index 24d15c6..0148103 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.outline.expect
@@ -1,37 +1,27 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field;
-  synthetic constructor •() → self::Class*
+  field core::int? field;
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::Class* {
+extension _extension#0 on self::Class {
   get property1 = self::_extension#0|get#property1;
   set property1 = self::_extension#0|set#property1;
 }
-extension _extension#1 on self::Class* {
+extension _extension#1 on self::Class {
   get property2 = self::_extension#1|get#property2;
   set property2 = self::_extension#1|set#property2;
 }
-static method _extension#0|get#property1(lowered final self::Class* #this) → core::int*
+static method _extension#0|get#property1(lowered final self::Class #this) → core::int?
   ;
-static method _extension#0|set#property1(lowered final self::Class* #this, core::int* value) → void
+static method _extension#0|set#property1(lowered final self::Class #this, core::int? value) → void
   ;
-static method _extension#1|get#property2(lowered final self::Class* #this) → core::int*
+static method _extension#1|get#property2(lowered final self::Class #this) → core::int?
   ;
-static method _extension#1|set#property2(lowered final self::Class* #this, core::int* value) → void
+static method _extension#1|set#property2(lowered final self::Class #this, core::int? value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.transformed.expect
index faaf375..06ac9e2 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.transformed.expect
@@ -1,50 +1,40 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::int* field = null;
-  synthetic constructor •() → self::Class*
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::Class* {
+extension _extension#0 on self::Class {
   get property1 = self::_extension#0|get#property1;
   set property1 = self::_extension#0|set#property1;
 }
-extension _extension#1 on self::Class* {
+extension _extension#1 on self::Class {
   get property2 = self::_extension#1|get#property2;
   set property2 = self::_extension#1|set#property2;
 }
-static method _extension#0|get#property1(lowered final self::Class* #this) → core::int*
+static method _extension#0|get#property1(lowered final self::Class #this) → core::int?
   return self::_extension#1|get#property2(#this);
-static method _extension#0|set#property1(lowered final self::Class* #this, core::int* value) → void
+static method _extension#0|set#property1(lowered final self::Class #this, core::int? value) → void
   return #this.{self::Class::field} = value;
-static method _extension#1|get#property2(lowered final self::Class* #this) → core::int*
-  return #this.{self::Class::field}{core::int*};
-static method _extension#1|set#property2(lowered final self::Class* #this, core::int* value) → void
-  return let final core::int* #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
+static method _extension#1|get#property2(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method _extension#1|set#property2(lowered final self::Class #this, core::int? value) → void
+  return let final core::int? #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::expect(null, self::_extension#0|get#property1(c));
   self::expect(null, self::_extension#1|get#property2(c));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
   self::expect(42, self::_extension#1|get#property2(c));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
   self::expect(87, self::_extension#0|get#property1(c));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart
index 8161b72..5210e3a 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline.expect
index fc12d80..fda67e5 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline_modelled.expect
index b8ad069..cccd074 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 class GenericClass<T> {}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
index 0dd6942..5ddfc92 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -125,52 +125,32 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method method = self::GenericExtension|method;
   tearoff method = self::GenericExtension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this, dynamic a) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|method(lowered final self::Class #this, dynamic a) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic a) → dynamic => self::Extension|method(#this, a);
-static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this) → dynamic {}
-static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this);
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this) → dynamic {}
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this);
 static method main() → dynamic {
-  core::String* s = "";
-  self::Class* c1 = new self::Class::•();
+  core::String s = "";
+  self::Class c1 = new self::Class::•();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:23:3: Error: Explicit extension application requires exactly 1 positional argument.
   Extension().method(null);
   ^^^^^^^^^"{dynamic}.method(null);
@@ -189,7 +169,7 @@
   self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
-            ^" in s as{TypeError} self::Class*, null);
+            ^" in s as{TypeError,ForNonNullableByDefault} self::Class, null);
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Member not found: 'foo'.
   Extension(c1).foo;
                 ^^^";
@@ -215,7 +195,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
   Extension(c1).method<int>(null);
                 ^";
-  self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
+  self::GenericClass<core::int> c2 = new self::GenericClass::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
   GenericExtension().method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
@@ -246,9 +226,9 @@
   self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
-                   ^" in s as{TypeError} self::GenericClass<dynamic>*);
-  self::GenericExtension|method<core::int*>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+                   ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<dynamic>);
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
-                        ^" in s as{TypeError} self::GenericClass<core::int*>*);
+                        ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<core::int>);
 }
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect
index 0dd6942..5ddfc92 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -125,52 +125,32 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method method = self::GenericExtension|method;
   tearoff method = self::GenericExtension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this, dynamic a) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|method(lowered final self::Class #this, dynamic a) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic a) → dynamic => self::Extension|method(#this, a);
-static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this) → dynamic {}
-static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this);
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this) → dynamic {}
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this);
 static method main() → dynamic {
-  core::String* s = "";
-  self::Class* c1 = new self::Class::•();
+  core::String s = "";
+  self::Class c1 = new self::Class::•();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:23:3: Error: Explicit extension application requires exactly 1 positional argument.
   Extension().method(null);
   ^^^^^^^^^"{dynamic}.method(null);
@@ -189,7 +169,7 @@
   self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
-            ^" in s as{TypeError} self::Class*, null);
+            ^" in s as{TypeError,ForNonNullableByDefault} self::Class, null);
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Member not found: 'foo'.
   Extension(c1).foo;
                 ^^^";
@@ -215,7 +195,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
   Extension(c1).method<int>(null);
                 ^";
-  self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
+  self::GenericClass<core::int> c2 = new self::GenericClass::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
   GenericExtension().method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
@@ -246,9 +226,9 @@
   self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
-                   ^" in s as{TypeError} self::GenericClass<dynamic>*);
-  self::GenericExtension|method<core::int*>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+                   ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<dynamic>);
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
-                        ^" in s as{TypeError} self::GenericClass<core::int*>*);
+                        ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<core::int>);
 }
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.outline.expect
index 064d285..94c79bb 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.outline.expect
@@ -1,50 +1,30 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method method = self::GenericExtension|method;
   tearoff method = self::GenericExtension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this, dynamic a) → dynamic
+static method Extension|method(lowered final self::Class #this, dynamic a) → dynamic
   ;
-static method Extension|get#method(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|get#method(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic a) → dynamic => self::Extension|method(#this, a);
-static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this) → dynamic
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this) → dynamic
   ;
-static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this);
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
index 0dd6942..5ddfc92 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -125,52 +125,32 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class GenericClass<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+class GenericClass<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
 }
-extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+extension GenericExtension<T extends core::Object? = dynamic> on self::GenericClass<T%> {
   method method = self::GenericExtension|method;
   tearoff method = self::GenericExtension|get#method;
 }
-static method Extension|method(lowered final self::Class* #this, dynamic a) → dynamic {}
-static method Extension|get#method(lowered final self::Class* #this) → (dynamic) →* dynamic
+static method Extension|method(lowered final self::Class #this, dynamic a) → dynamic {}
+static method Extension|get#method(lowered final self::Class #this) → (dynamic) → dynamic
   return (dynamic a) → dynamic => self::Extension|method(#this, a);
-static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this) → dynamic {}
-static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this);
+static method GenericExtension|method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T%> #this) → dynamic {}
+static method GenericExtension|get#method<T extends core::Object? = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T%>(#this);
 static method main() → dynamic {
-  core::String* s = "";
-  self::Class* c1 = new self::Class::•();
+  core::String s = "";
+  self::Class c1 = new self::Class::•();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:23:3: Error: Explicit extension application requires exactly 1 positional argument.
   Extension().method(null);
   ^^^^^^^^^"{dynamic}.method(null);
@@ -189,7 +169,7 @@
   self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   Extension(s).method(null);
-            ^" in s as{TypeError} self::Class*, null);
+            ^" in s as{TypeError,ForNonNullableByDefault} self::Class, null);
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Member not found: 'foo'.
   Extension(c1).foo;
                 ^^^";
@@ -215,7 +195,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
   Extension(c1).method<int>(null);
                 ^";
-  self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
+  self::GenericClass<core::int> c2 = new self::GenericClass::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
   GenericExtension().method();
   ^^^^^^^^^^^^^^^^"{dynamic}.method();
@@ -246,9 +226,9 @@
   self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension(s).method();
-                   ^" in s as{TypeError} self::GenericClass<dynamic>*);
-  self::GenericExtension|method<core::int*>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+                   ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<dynamic>);
+  self::GenericExtension|method<core::int>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
   GenericExtension<int>(s).method();
-                        ^" in s as{TypeError} self::GenericClass<core::int*>*);
+                        ^" in s as{TypeError,ForNonNullableByDefault} self::GenericClass<core::int>);
 }
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart
index acadced..3fdcc7d 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on String {
   static method() {}
   static get getter => null;
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline.expect
index 69490b0..2654863 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension Extension on String {
   static method() {}
   static get getter => null;
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline_modelled.expect
index ab88088..0abe64c 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 errors() {}
 
 extension Extension on String {
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.expect
index 94d05b9..023cc74 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -49,7 +49,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   static method method = self::Extension|method;
   static get getter = get self::Extension|getter;
   static get property = get self::Extension|property;
@@ -67,7 +67,7 @@
 static set Extension|property(dynamic _) → void {}
 static method main() → dynamic {}
 static method errors() → dynamic {
-  core::String* s = "";
+  core::String s = "";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
   Extension(s).method();
                ^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect
index 94d05b9..023cc74 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -49,7 +49,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   static method method = self::Extension|method;
   static get getter = get self::Extension|getter;
   static get property = get self::Extension|property;
@@ -67,7 +67,7 @@
 static set Extension|property(dynamic _) → void {}
 static method main() → dynamic {}
 static method errors() → dynamic {
-  core::String* s = "";
+  core::String s = "";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
   Extension(s).method();
                ^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.outline.expect
index 76899b5..b8edf40 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.outline.expect
@@ -1,8 +1,8 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   static method method = self::Extension|method;
   static get getter = get self::Extension|getter;
   static get property = get self::Extension|property;
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.transformed.expect
index 94d05b9..023cc74 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -49,7 +49,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension on core::String* {
+extension Extension on core::String {
   static method method = self::Extension|method;
   static get getter = get self::Extension|getter;
   static get property = get self::Extension|property;
@@ -67,7 +67,7 @@
 static set Extension|property(dynamic _) → void {}
 static method main() → dynamic {}
 static method errors() → dynamic {
-  core::String* s = "";
+  core::String s = "";
   invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
   Extension(s).method();
                ^^^^^^";
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart b/pkg/front_end/testcases/extensions/issue38600.dart
index 8ad593c..d2014e2 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart
+++ b/pkg/front_end/testcases/extensions/issue38600.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class<T> {}
 
 extension try<T> on Class<T> {}
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38600.dart.textual_outline.expect
index edb7740..43bf0c2 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T> {}
 extension on{}
 try<T> (){}
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38600.dart.weak.expect
index 373bda2..0550755 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -48,22 +48,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 extension _extension#0 on invalid-type {
 }
-static method try<T extends core::Object* = dynamic>() → dynamic {}
+static method try<T extends core::Object? = dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect
index 373bda2..0550755 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -48,22 +48,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 extension _extension#0 on invalid-type {
 }
-static method try<T extends core::Object* = dynamic>() → dynamic {}
+static method try<T extends core::Object? = dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38600.dart.weak.outline.expect
index ed495ec..07a25e2 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -48,23 +48,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 extension _extension#0 on invalid-type {
 }
-static method try<T extends core::Object* = dynamic>() → dynamic
+static method try<T extends core::Object? = dynamic>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38600.dart.weak.transformed.expect
index 373bda2..0550755 100644
--- a/pkg/front_end/testcases/extensions/issue38600.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -48,22 +48,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 extension _extension#0 on invalid-type {
 }
-static method try<T extends core::Object* = dynamic>() → dynamic {}
+static method try<T extends core::Object? = dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart b/pkg/front_end/testcases/extensions/issue38712.dart
index 799af6a..511036f 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart
+++ b/pkg/front_end/testcases/extensions/issue38712.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension C {
 }
 
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38712.dart.textual_outline.expect
index 3faefa5..ec4321b 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.textual_outline.expect
@@ -1,3 +1,2 @@
-// @dart = 2.9
 extension C on{}
 void main() {}
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38712.dart.weak.expect
index 464cf79..5c2b8df 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect
index 464cf79..5c2b8df 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38712.dart.weak.outline.expect
index 3f1a511..569a1aa 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38712.dart.weak.transformed.expect
index 464cf79..5c2b8df 100644
--- a/pkg/front_end/testcases/extensions/issue38712.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart b/pkg/front_end/testcases/extensions/issue38713.dart
index ef83847..b32ad41 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart
+++ b/pkg/front_end/testcases/extensions/issue38713.dart
@@ -1,13 +1,13 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
-extension C on int {
-  static int property2;
-  static void set property2(int x) {}
 
-  static void set property3(int x) {}
-  int get property3 => 1;
+extension C on int {
+  static int? property2;
+  static void set property2(int? x) {}
+
+  static void set property3(int? x) {}
+  int? get property3 => 1;
 }
 
 void main() {
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline.expect
index 06e37f8..b8034a7 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline.expect
@@ -1,9 +1,8 @@
-// @dart = 2.9
 extension C on int {
-  static int property2;
-  static void set property2(int x) {}
-  static void set property3(int x) {}
-  int get property3 => 1;
+  static int? property2;
+  static void set property2(int? x) {}
+  static void set property3(int? x) {}
+  int? get property3 => 1;
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline_modelled.expect
index 39b481c..6bf2fb6 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.textual_outline_modelled.expect
@@ -1,9 +1,8 @@
-// @dart = 2.9
 extension C on int {
-  int get property3 => 1;
-  static int property2;
-  static void set property2(int x) {}
-  static void set property3(int x) {}
+  int? get property3 => 1;
+  static int? property2;
+  static void set property2(int? x) {}
+  static void set property3(int? x) {}
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38713.dart.weak.expect
index 8dbe072..c4cab22 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.weak.expect
@@ -1,34 +1,34 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:7:19: Error: Conflicts with the implicit setter of the field 'property2'.
-//   static void set property2(int x) {}
+//   static void set property2(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:6:14: Error: Conflicts with setter 'property2'.
-//   static int property2;
-//              ^
+// pkg/front_end/testcases/extensions/issue38713.dart:6:15: Error: Conflicts with setter 'property2'.
+//   static int? property2;
+//               ^
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:9:19: Error: Conflicts with member 'property3'.
-//   static void set property3(int x) {}
+//   static void set property3(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:10:11: Error: Conflicts with setter 'property3'.
-//   int get property3 => 1;
-//           ^
+// pkg/front_end/testcases/extensions/issue38713.dart:10:12: Error: Conflicts with setter 'property3'.
+//   int? get property3 => 1;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
 
-extension C on core::int* {
+extension C on core::int {
   static field property2 = self::C|property2;
   get property3 = self::C|get#property3;
   static set property3 = set self::C|property3;
 }
-static field core::int* C|property2;
-static set C|property3(core::int* x) → void {}
-static method C|get#property3(lowered final core::int* #this) → core::int*
+static field core::int? C|property2;
+static set C|property3(core::int? x) → void {}
+static method C|get#property3(lowered final core::int #this) → core::int?
   return 1;
 static method main() → void {
   self::C|property2;
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect
index 8dbe072..c4cab22 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect
@@ -1,34 +1,34 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:7:19: Error: Conflicts with the implicit setter of the field 'property2'.
-//   static void set property2(int x) {}
+//   static void set property2(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:6:14: Error: Conflicts with setter 'property2'.
-//   static int property2;
-//              ^
+// pkg/front_end/testcases/extensions/issue38713.dart:6:15: Error: Conflicts with setter 'property2'.
+//   static int? property2;
+//               ^
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:9:19: Error: Conflicts with member 'property3'.
-//   static void set property3(int x) {}
+//   static void set property3(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:10:11: Error: Conflicts with setter 'property3'.
-//   int get property3 => 1;
-//           ^
+// pkg/front_end/testcases/extensions/issue38713.dart:10:12: Error: Conflicts with setter 'property3'.
+//   int? get property3 => 1;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
 
-extension C on core::int* {
+extension C on core::int {
   static field property2 = self::C|property2;
   get property3 = self::C|get#property3;
   static set property3 = set self::C|property3;
 }
-static field core::int* C|property2;
-static set C|property3(core::int* x) → void {}
-static method C|get#property3(lowered final core::int* #this) → core::int*
+static field core::int? C|property2;
+static set C|property3(core::int? x) → void {}
+static method C|get#property3(lowered final core::int #this) → core::int?
   return 1;
 static method main() → void {
   self::C|property2;
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38713.dart.weak.outline.expect
index 6cfc008..98f41705 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.weak.outline.expect
@@ -1,35 +1,35 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:7:19: Error: Conflicts with the implicit setter of the field 'property2'.
-//   static void set property2(int x) {}
+//   static void set property2(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:6:14: Error: Conflicts with setter 'property2'.
-//   static int property2;
-//              ^
+// pkg/front_end/testcases/extensions/issue38713.dart:6:15: Error: Conflicts with setter 'property2'.
+//   static int? property2;
+//               ^
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:9:19: Error: Conflicts with member 'property3'.
-//   static void set property3(int x) {}
+//   static void set property3(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:10:11: Error: Conflicts with setter 'property3'.
-//   int get property3 => 1;
-//           ^
+// pkg/front_end/testcases/extensions/issue38713.dart:10:12: Error: Conflicts with setter 'property3'.
+//   int? get property3 => 1;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
 
-extension C on core::int* {
+extension C on core::int {
   static field property2 = self::C|property2;
   get property3 = self::C|get#property3;
   static set property3 = set self::C|property3;
 }
-static field core::int* C|property2;
-static set C|property3(core::int* x) → void
+static field core::int? C|property2;
+static set C|property3(core::int? x) → void
   ;
-static method C|get#property3(lowered final core::int* #this) → core::int*
+static method C|get#property3(lowered final core::int #this) → core::int?
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38713.dart.weak.transformed.expect
index 8dbe072..c4cab22 100644
--- a/pkg/front_end/testcases/extensions/issue38713.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.weak.transformed.expect
@@ -1,34 +1,34 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:7:19: Error: Conflicts with the implicit setter of the field 'property2'.
-//   static void set property2(int x) {}
+//   static void set property2(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:6:14: Error: Conflicts with setter 'property2'.
-//   static int property2;
-//              ^
+// pkg/front_end/testcases/extensions/issue38713.dart:6:15: Error: Conflicts with setter 'property2'.
+//   static int? property2;
+//               ^
 //
 // pkg/front_end/testcases/extensions/issue38713.dart:9:19: Error: Conflicts with member 'property3'.
-//   static void set property3(int x) {}
+//   static void set property3(int? x) {}
 //                   ^
 //
-// pkg/front_end/testcases/extensions/issue38713.dart:10:11: Error: Conflicts with setter 'property3'.
-//   int get property3 => 1;
-//           ^
+// pkg/front_end/testcases/extensions/issue38713.dart:10:12: Error: Conflicts with setter 'property3'.
+//   int? get property3 => 1;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
 
-extension C on core::int* {
+extension C on core::int {
   static field property2 = self::C|property2;
   get property3 = self::C|get#property3;
   static set property3 = set self::C|property3;
 }
-static field core::int* C|property2;
-static set C|property3(core::int* x) → void {}
-static method C|get#property3(lowered final core::int* #this) → core::int*
+static field core::int? C|property2;
+static set C|property3(core::int? x) → void {}
+static method C|get#property3(lowered final core::int #this) → core::int?
   return 1;
 static method main() → void {
   self::C|property2;
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart b/pkg/front_end/testcases/extensions/issue38745.dart
index e285241..357a655 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart
+++ b/pkg/front_end/testcases/extensions/issue38745.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class C<T> {
 }
 
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38745.dart.textual_outline.expect
index 2fa8049..d0a4d03 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C<T> {}
 extension ext<T> on C<T> {
   int field;
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38745.dart.weak.expect
index aa7f4d8..d345fc2 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -98,22 +98,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext<T extends core::Object* = dynamic> on self::C<T*>* {
+extension ext<T extends core::Object? = dynamic> on self::C<T%> {
   field field = self::ext|field;
   field property = self::ext|property;
   field property2 = self::ext|property2;
@@ -122,12 +112,12 @@
   set property = self::ext|set#property;
   static set property2 = set self::ext|property2;
 }
-static field core::int* ext|field;
-static final field core::int* ext|property = 42;
-static final field core::int* ext|property2 = 42;
-static method ext|set#property<T extends core::Object* = dynamic>(lowered final self::C<self::ext|set#property::T*>* #this, core::int* value) → void {}
-static set ext|property2(core::int* value) → void {}
-static method ext|method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|method::T*>* #this) → dynamic {
+static field core::int ext|field;
+static final field core::int ext|property = 42;
+static final field core::int ext|property2 = 42;
+static method ext|set#property<T extends core::Object? = dynamic>(lowered final self::C<self::ext|set#property::T%> #this, core::int value) → void {}
+static set ext|property2(core::int value) → void {}
+static method ext|method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|method::T%> #this) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:20:5: Error: Undefined name 'field'.
     field;
     ^^^^^";
@@ -137,7 +127,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:22:5: Error: Getter not found: 'property'.
     property;
     ^^^^^^^^";
-  self::ext|set#property<self::ext|method::T*>(#this, 23);
+  self::ext|set#property<self::ext|method::T%>(#this, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:24:5: Error: Undefined name 'property2'.
     property2;
     ^^^^^^^^^";
@@ -145,11 +135,11 @@
     property2 = 23;
     ^^^^^^^^^";
 }
-static method ext|get#method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::ext|method<self::ext|get#method::T*>(#this);
+static method ext|get#method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::ext|method<self::ext|get#method::T%>(#this);
 static method main() → dynamic {}
 static method errors() → dynamic {
-  self::C<core::int*>* c = new self::C::•<core::int*>();
+  self::C<core::int> c = new self::C::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:34:5: Error: The getter 'field' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'field'.
@@ -165,7 +155,7 @@
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   c.property;
     ^^^^^^^^" in c{<unresolved>}.property;
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:38:5: Error: The getter 'property2' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property2'.
@@ -185,12 +175,12 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:42:10: Error: Getter not found: 'property'.
   ext(c).property;
          ^^^^^^^^";
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:44:10: Error: Member not found: 'property2'.
   ext(c).property2;
          ^^^^^^^^^";
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:45:10: Error: Setter not found: 'property2'.
   ext(c).property2 = 23;
          ^^^^^^^^^";
-  self::ext|method<core::int*>(c);
+  self::ext|method<core::int>(c);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect
index aa7f4d8..d345fc2 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -98,22 +98,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext<T extends core::Object* = dynamic> on self::C<T*>* {
+extension ext<T extends core::Object? = dynamic> on self::C<T%> {
   field field = self::ext|field;
   field property = self::ext|property;
   field property2 = self::ext|property2;
@@ -122,12 +112,12 @@
   set property = self::ext|set#property;
   static set property2 = set self::ext|property2;
 }
-static field core::int* ext|field;
-static final field core::int* ext|property = 42;
-static final field core::int* ext|property2 = 42;
-static method ext|set#property<T extends core::Object* = dynamic>(lowered final self::C<self::ext|set#property::T*>* #this, core::int* value) → void {}
-static set ext|property2(core::int* value) → void {}
-static method ext|method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|method::T*>* #this) → dynamic {
+static field core::int ext|field;
+static final field core::int ext|property = 42;
+static final field core::int ext|property2 = 42;
+static method ext|set#property<T extends core::Object? = dynamic>(lowered final self::C<self::ext|set#property::T%> #this, core::int value) → void {}
+static set ext|property2(core::int value) → void {}
+static method ext|method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|method::T%> #this) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:20:5: Error: Undefined name 'field'.
     field;
     ^^^^^";
@@ -137,7 +127,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:22:5: Error: Getter not found: 'property'.
     property;
     ^^^^^^^^";
-  self::ext|set#property<self::ext|method::T*>(#this, 23);
+  self::ext|set#property<self::ext|method::T%>(#this, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:24:5: Error: Undefined name 'property2'.
     property2;
     ^^^^^^^^^";
@@ -145,11 +135,11 @@
     property2 = 23;
     ^^^^^^^^^";
 }
-static method ext|get#method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::ext|method<self::ext|get#method::T*>(#this);
+static method ext|get#method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::ext|method<self::ext|get#method::T%>(#this);
 static method main() → dynamic {}
 static method errors() → dynamic {
-  self::C<core::int*>* c = new self::C::•<core::int*>();
+  self::C<core::int> c = new self::C::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:34:5: Error: The getter 'field' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'field'.
@@ -165,7 +155,7 @@
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   c.property;
     ^^^^^^^^" in c{<unresolved>}.property;
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:38:5: Error: The getter 'property2' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property2'.
@@ -185,12 +175,12 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:42:10: Error: Getter not found: 'property'.
   ext(c).property;
          ^^^^^^^^";
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:44:10: Error: Member not found: 'property2'.
   ext(c).property2;
          ^^^^^^^^^";
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:45:10: Error: Setter not found: 'property2'.
   ext(c).property2 = 23;
          ^^^^^^^^^";
-  self::ext|method<core::int*>(c);
+  self::ext|method<core::int>(c);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38745.dart.weak.outline.expect
index 8777198..d8b235e 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -28,21 +28,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext<T extends core::Object* = dynamic> on self::C<T*>* {
+extension ext<T extends core::Object? = dynamic> on self::C<T%> {
   field field = self::ext|field;
   field property = self::ext|property;
   field property2 = self::ext|property2;
@@ -51,17 +41,17 @@
   set property = self::ext|set#property;
   static set property2 = set self::ext|property2;
 }
-static field core::int* ext|field;
-static final field core::int* ext|property;
-static final field core::int* ext|property2;
-static method ext|set#property<T extends core::Object* = dynamic>(lowered final self::C<self::ext|set#property::T*>* #this, core::int* value) → void
+static field core::int ext|field;
+static final field core::int ext|property;
+static final field core::int ext|property2;
+static method ext|set#property<T extends core::Object? = dynamic>(lowered final self::C<self::ext|set#property::T%> #this, core::int value) → void
   ;
-static set ext|property2(core::int* value) → void
+static set ext|property2(core::int value) → void
   ;
-static method ext|method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|method::T*>* #this) → dynamic
+static method ext|method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|method::T%> #this) → dynamic
   ;
-static method ext|get#method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::ext|method<self::ext|get#method::T*>(#this);
+static method ext|get#method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::ext|method<self::ext|get#method::T%>(#this);
 static method main() → dynamic
   ;
 static method errors() → dynamic
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38745.dart.weak.transformed.expect
index aa7f4d8..d345fc2 100644
--- a/pkg/front_end/testcases/extensions/issue38745.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -98,22 +98,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext<T extends core::Object* = dynamic> on self::C<T*>* {
+extension ext<T extends core::Object? = dynamic> on self::C<T%> {
   field field = self::ext|field;
   field property = self::ext|property;
   field property2 = self::ext|property2;
@@ -122,12 +112,12 @@
   set property = self::ext|set#property;
   static set property2 = set self::ext|property2;
 }
-static field core::int* ext|field;
-static final field core::int* ext|property = 42;
-static final field core::int* ext|property2 = 42;
-static method ext|set#property<T extends core::Object* = dynamic>(lowered final self::C<self::ext|set#property::T*>* #this, core::int* value) → void {}
-static set ext|property2(core::int* value) → void {}
-static method ext|method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|method::T*>* #this) → dynamic {
+static field core::int ext|field;
+static final field core::int ext|property = 42;
+static final field core::int ext|property2 = 42;
+static method ext|set#property<T extends core::Object? = dynamic>(lowered final self::C<self::ext|set#property::T%> #this, core::int value) → void {}
+static set ext|property2(core::int value) → void {}
+static method ext|method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|method::T%> #this) → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:20:5: Error: Undefined name 'field'.
     field;
     ^^^^^";
@@ -137,7 +127,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:22:5: Error: Getter not found: 'property'.
     property;
     ^^^^^^^^";
-  self::ext|set#property<self::ext|method::T*>(#this, 23);
+  self::ext|set#property<self::ext|method::T%>(#this, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:24:5: Error: Undefined name 'property2'.
     property2;
     ^^^^^^^^^";
@@ -145,11 +135,11 @@
     property2 = 23;
     ^^^^^^^^^";
 }
-static method ext|get#method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|get#method::T*>* #this) → () →* dynamic
-  return () → dynamic => self::ext|method<self::ext|get#method::T*>(#this);
+static method ext|get#method<T extends core::Object? = dynamic>(lowered final self::C<self::ext|get#method::T%> #this) → () → dynamic
+  return () → dynamic => self::ext|method<self::ext|get#method::T%>(#this);
 static method main() → dynamic {}
 static method errors() → dynamic {
-  self::C<core::int*>* c = new self::C::•<core::int*>();
+  self::C<core::int> c = new self::C::•<core::int>();
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:34:5: Error: The getter 'field' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'field'.
@@ -165,7 +155,7 @@
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   c.property;
     ^^^^^^^^" in c{<unresolved>}.property;
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:38:5: Error: The getter 'property2' isn't defined for the class 'C<int>'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property2'.
@@ -185,12 +175,12 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:42:10: Error: Getter not found: 'property'.
   ext(c).property;
          ^^^^^^^^";
-  self::ext|set#property<core::int*>(c, 23);
+  self::ext|set#property<core::int>(c, 23);
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:44:10: Error: Member not found: 'property2'.
   ext(c).property2;
          ^^^^^^^^^";
   invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:45:10: Error: Setter not found: 'property2'.
   ext(c).property2 = 23;
          ^^^^^^^^^";
-  self::ext|method<core::int*>(c);
+  self::ext|method<core::int>(c);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart b/pkg/front_end/testcases/extensions/issue38750.dart
index 24eaeb9..46f0bc6 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart
+++ b/pkg/front_end/testcases/extensions/issue38750.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'issue38750_lib1.dart';
 import 'issue38750_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline.expect
index 974f3ed..5bc7316 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'issue38750_lib1.dart';
 import 'issue38750_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline_modelled.expect
index 6ee009d..cca0335 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'issue38750_lib1.dart';
 import 'issue38750_lib2.dart';
 
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38750.dart.weak.expect
index 4dbcce1..3f0fc8c 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,7 +26,7 @@
 
 static method main() → dynamic {}
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:12:5: Error: The method '_foo' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_foo'.
@@ -35,7 +35,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:13:5: Error: Member not found: 'C._staticFoo'.
   C._staticFoo();
     ^^^^^^^^^^";
-  c.{iss::C::foo}(){() →* dynamic};
+  c.{iss::C::foo}(){() → dynamic};
   iss::C::staticFoo();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:16:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
@@ -44,21 +44,21 @@
     ^^^^" in c{<unresolved>}._bar();
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as iss;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → iss::C*
+  synthetic constructor •() → iss::C
     : super core::Object::•()
     ;
   method foo() → dynamic
-    return this.{iss::C::_foo}(){() →* dynamic};
+    return this.{iss::C::_foo}(){() → dynamic};
   method _foo() → dynamic {
     try {
       throw "producing a stack trace";
     }
-    on dynamic catch(final dynamic e, final core::StackTrace* s) {
+    on core::Object catch(final core::Object e, final core::StackTrace s) {
       core::print(s);
     }
   }
@@ -67,33 +67,23 @@
   }
   static method staticFoo() → dynamic
     return iss::C::_staticFoo();
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext on iss::C* {
+extension ext on iss::C {
   method _bar = iss::ext|_bar;
   tearoff _bar = iss::ext|get#_bar;
 }
-static method ext|_bar(lowered final iss::C* #this) → dynamic {
+static method ext|_bar(lowered final iss::C #this) → dynamic {
   try {
     throw "producing a stack trace";
   }
-  on dynamic catch(final dynamic e, final core::StackTrace* s) {
+  on core::Object catch(final core::Object e, final core::StackTrace s) {
     core::print(s);
   }
 }
-static method ext|get#_bar(lowered final iss::C* #this) → () →* dynamic
+static method ext|get#_bar(lowered final iss::C #this) → () → dynamic
   return () → dynamic => iss::ext|_bar(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -109,7 +99,7 @@
 import "org-dartlang-testcase:///issue38750_lib1.dart";
 
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750_lib2.dart:9:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_bar'.
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect
index 4dbcce1..3f0fc8c 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,7 +26,7 @@
 
 static method main() → dynamic {}
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:12:5: Error: The method '_foo' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_foo'.
@@ -35,7 +35,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:13:5: Error: Member not found: 'C._staticFoo'.
   C._staticFoo();
     ^^^^^^^^^^";
-  c.{iss::C::foo}(){() →* dynamic};
+  c.{iss::C::foo}(){() → dynamic};
   iss::C::staticFoo();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:16:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
@@ -44,21 +44,21 @@
     ^^^^" in c{<unresolved>}._bar();
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as iss;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → iss::C*
+  synthetic constructor •() → iss::C
     : super core::Object::•()
     ;
   method foo() → dynamic
-    return this.{iss::C::_foo}(){() →* dynamic};
+    return this.{iss::C::_foo}(){() → dynamic};
   method _foo() → dynamic {
     try {
       throw "producing a stack trace";
     }
-    on dynamic catch(final dynamic e, final core::StackTrace* s) {
+    on core::Object catch(final core::Object e, final core::StackTrace s) {
       core::print(s);
     }
   }
@@ -67,33 +67,23 @@
   }
   static method staticFoo() → dynamic
     return iss::C::_staticFoo();
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext on iss::C* {
+extension ext on iss::C {
   method _bar = iss::ext|_bar;
   tearoff _bar = iss::ext|get#_bar;
 }
-static method ext|_bar(lowered final iss::C* #this) → dynamic {
+static method ext|_bar(lowered final iss::C #this) → dynamic {
   try {
     throw "producing a stack trace";
   }
-  on dynamic catch(final dynamic e, final core::StackTrace* s) {
+  on core::Object catch(final core::Object e, final core::StackTrace s) {
     core::print(s);
   }
 }
-static method ext|get#_bar(lowered final iss::C* #this) → () →* dynamic
+static method ext|get#_bar(lowered final iss::C #this) → () → dynamic
   return () → dynamic => iss::ext|_bar(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -109,7 +99,7 @@
 import "org-dartlang-testcase:///issue38750_lib1.dart";
 
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750_lib2.dart:9:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_bar'.
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38750.dart.weak.outline.expect
index 68e7bae..e01e4b8 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///issue38750_lib1.dart";
@@ -9,12 +9,12 @@
 static method errors() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self2::C*
+  synthetic constructor •() → self2::C
     ;
   method foo() → dynamic
     ;
@@ -24,27 +24,17 @@
     ;
   static method staticFoo() → dynamic
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext on self2::C* {
+extension ext on self2::C {
   method _bar = self2::ext|_bar;
   tearoff _bar = self2::ext|get#_bar;
 }
-static method ext|_bar(lowered final self2::C* #this) → dynamic
+static method ext|_bar(lowered final self2::C #this) → dynamic
   ;
-static method ext|get#_bar(lowered final self2::C* #this) → () →* dynamic
+static method ext|get#_bar(lowered final self2::C #this) → () → dynamic
   return () → dynamic => self2::ext|_bar(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self3;
 
 import "org-dartlang-testcase:///issue38750_lib1.dart";
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38750.dart.weak.transformed.expect
index 4dbcce1..3f0fc8c 100644
--- a/pkg/front_end/testcases/extensions/issue38750.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -26,7 +26,7 @@
 
 static method main() → dynamic {}
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:12:5: Error: The method '_foo' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_foo'.
@@ -35,7 +35,7 @@
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:13:5: Error: Member not found: 'C._staticFoo'.
   C._staticFoo();
     ^^^^^^^^^^";
-  c.{iss::C::foo}(){() →* dynamic};
+  c.{iss::C::foo}(){() → dynamic};
   iss::C::staticFoo();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:16:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
@@ -44,21 +44,21 @@
     ^^^^" in c{<unresolved>}._bar();
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as iss;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → iss::C*
+  synthetic constructor •() → iss::C
     : super core::Object::•()
     ;
   method foo() → dynamic
-    return this.{iss::C::_foo}(){() →* dynamic};
+    return this.{iss::C::_foo}(){() → dynamic};
   method _foo() → dynamic {
     try {
       throw "producing a stack trace";
     }
-    on dynamic catch(final dynamic e, final core::StackTrace* s) {
+    on core::Object catch(final core::Object e, final core::StackTrace s) {
       core::print(s);
     }
   }
@@ -67,33 +67,23 @@
   }
   static method staticFoo() → dynamic
     return iss::C::_staticFoo();
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension ext on iss::C* {
+extension ext on iss::C {
   method _bar = iss::ext|_bar;
   tearoff _bar = iss::ext|get#_bar;
 }
-static method ext|_bar(lowered final iss::C* #this) → dynamic {
+static method ext|_bar(lowered final iss::C #this) → dynamic {
   try {
     throw "producing a stack trace";
   }
-  on dynamic catch(final dynamic e, final core::StackTrace* s) {
+  on core::Object catch(final core::Object e, final core::StackTrace s) {
     core::print(s);
   }
 }
-static method ext|get#_bar(lowered final iss::C* #this) → () →* dynamic
+static method ext|get#_bar(lowered final iss::C #this) → () → dynamic
   return () → dynamic => iss::ext|_bar(#this);
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -109,7 +99,7 @@
 import "org-dartlang-testcase:///issue38750_lib1.dart";
 
 static method errors() → dynamic {
-  iss::C* c = new iss::C::•();
+  iss::C c = new iss::C::•();
   invalid-expression "pkg/front_end/testcases/extensions/issue38750_lib2.dart:9:5: Error: The method '_bar' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
 Try correcting the name to the name of an existing method, or defining a method named '_bar'.
diff --git a/pkg/front_end/testcases/extensions/issue38750_lib1.dart b/pkg/front_end/testcases/extensions/issue38750_lib1.dart
index 00fddf2..e2913d7 100644
--- a/pkg/front_end/testcases/extensions/issue38750_lib1.dart
+++ b/pkg/front_end/testcases/extensions/issue38750_lib1.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class C {
   foo() => _foo();
   _foo() {
diff --git a/pkg/front_end/testcases/extensions/issue38750_lib2.dart b/pkg/front_end/testcases/extensions/issue38750_lib2.dart
index 3385c39..8432aad 100644
--- a/pkg/front_end/testcases/extensions/issue38750_lib2.dart
+++ b/pkg/front_end/testcases/extensions/issue38750_lib2.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'issue38750_lib1.dart';
 
 errors() {
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart b/pkg/front_end/testcases/extensions/issue38755.dart
index 68e25cd7..cdc9cca 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart
+++ b/pkg/front_end/testcases/extensions/issue38755.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 final list = ["a", "b", "c"].myMap((it) => it);
 
 extension A<T> on List<T> {
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline.expect
index 173682a..c52f04b 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 final list = ["a", "b", "c"].myMap((it) => it);
 
 extension A<T> on List<T> {
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline_modelled.expect
index 649da97..fd90a7a 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension A<T> on List<T> {
   List<R> myMap<R>(R Function(T) block) {}
 }
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38755.dart.weak.expect
index 8be9036..fc70b9d 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.weak.expect
@@ -1,17 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension A<T extends core::Object* = dynamic> on core::List<T*>* {
+extension A<T extends core::Object? = dynamic> on core::List<T%> {
   method myMap = self::A|myMap;
   tearoff myMap = self::A|get#myMap;
 }
-static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(<core::String*>["a", "b", "c"], (core::String* it) → core::String* => it);
-static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
-  return #this.{core::Iterable::map}<self::A|myMap::R*>(block){((self::A|myMap::T*) →* self::A|myMap::R*) →* core::Iterable<self::A|myMap::R*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<self::A|myMap::R*>*};
+static final field core::List<core::String> list = self::A|myMap<core::String, core::String>(<core::String>["a", "b", "c"], (core::String it) → core::String => it);
+static method A|myMap<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final core::List<self::A|myMap::T%> #this, (self::A|myMap::T%) → self::A|myMap::R% block) → core::List<self::A|myMap::R%> {
+  return #this.{core::Iterable::map}<self::A|myMap::R%>(block){((self::A|myMap::T%) → self::A|myMap::R%) → core::Iterable<self::A|myMap::R%>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<self::A|myMap::R%>};
 }
-static method A|get#myMap<T extends core::Object* = dynamic>(lowered final core::List<self::A|get#myMap::T*>* #this) → <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R*) →* core::List<R*>*
-  return <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R* block) → core::List<R*>* => self::A|myMap<self::A|get#myMap::T*, R*>(#this, block);
+static method A|get#myMap<T extends core::Object? = dynamic>(lowered final core::List<self::A|get#myMap::T%> #this) → <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R%) → core::List<R%>
+  return <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R% block) → core::List<R%> => self::A|myMap<self::A|get#myMap::T%, R%>(#this, block);
 static method main() → dynamic {
   core::print(self::list);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect
index 8be9036..fc70b9d 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect
@@ -1,17 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension A<T extends core::Object* = dynamic> on core::List<T*>* {
+extension A<T extends core::Object? = dynamic> on core::List<T%> {
   method myMap = self::A|myMap;
   tearoff myMap = self::A|get#myMap;
 }
-static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(<core::String*>["a", "b", "c"], (core::String* it) → core::String* => it);
-static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
-  return #this.{core::Iterable::map}<self::A|myMap::R*>(block){((self::A|myMap::T*) →* self::A|myMap::R*) →* core::Iterable<self::A|myMap::R*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<self::A|myMap::R*>*};
+static final field core::List<core::String> list = self::A|myMap<core::String, core::String>(<core::String>["a", "b", "c"], (core::String it) → core::String => it);
+static method A|myMap<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final core::List<self::A|myMap::T%> #this, (self::A|myMap::T%) → self::A|myMap::R% block) → core::List<self::A|myMap::R%> {
+  return #this.{core::Iterable::map}<self::A|myMap::R%>(block){((self::A|myMap::T%) → self::A|myMap::R%) → core::Iterable<self::A|myMap::R%>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<self::A|myMap::R%>};
 }
-static method A|get#myMap<T extends core::Object* = dynamic>(lowered final core::List<self::A|get#myMap::T*>* #this) → <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R*) →* core::List<R*>*
-  return <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R* block) → core::List<R*>* => self::A|myMap<self::A|get#myMap::T*, R*>(#this, block);
+static method A|get#myMap<T extends core::Object? = dynamic>(lowered final core::List<self::A|get#myMap::T%> #this) → <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R%) → core::List<R%>
+  return <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R% block) → core::List<R%> => self::A|myMap<self::A|get#myMap::T%, R%>(#this, block);
 static method main() → dynamic {
   core::print(self::list);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38755.dart.weak.outline.expect
index 13c7102..a2243c6 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.weak.outline.expect
@@ -1,15 +1,15 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension A<T extends core::Object* = dynamic> on core::List<T*>* {
+extension A<T extends core::Object? = dynamic> on core::List<T%> {
   method myMap = self::A|myMap;
   tearoff myMap = self::A|get#myMap;
 }
-static final field core::List<core::String*>* list;
-static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>*
+static final field core::List<core::String> list;
+static method A|myMap<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final core::List<self::A|myMap::T%> #this, (self::A|myMap::T%) → self::A|myMap::R% block) → core::List<self::A|myMap::R%>
   ;
-static method A|get#myMap<T extends core::Object* = dynamic>(lowered final core::List<self::A|get#myMap::T*>* #this) → <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R*) →* core::List<R*>*
-  return <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R* block) → core::List<R*>* => self::A|myMap<self::A|get#myMap::T*, R*>(#this, block);
+static method A|get#myMap<T extends core::Object? = dynamic>(lowered final core::List<self::A|get#myMap::T%> #this) → <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R%) → core::List<R%>
+  return <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R% block) → core::List<R%> => self::A|myMap<self::A|get#myMap::T%, R%>(#this, block);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38755.dart.weak.transformed.expect
index b5537fa..848852b 100644
--- a/pkg/front_end/testcases/extensions/issue38755.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.weak.transformed.expect
@@ -1,17 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-extension A<T extends core::Object* = dynamic> on core::List<T*>* {
+extension A<T extends core::Object? = dynamic> on core::List<T%> {
   method myMap = self::A|myMap;
   tearoff myMap = self::A|get#myMap;
 }
-static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(core::_GrowableList::_literal3<core::String*>("a", "b", "c"), (core::String* it) → core::String* => it);
-static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
-  return #this.{core::Iterable::map}<self::A|myMap::R*>(block){((self::A|myMap::T*) →* self::A|myMap::R*) →* core::Iterable<self::A|myMap::R*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<self::A|myMap::R*>*};
+static final field core::List<core::String> list = self::A|myMap<core::String, core::String>(core::_GrowableList::_literal3<core::String>("a", "b", "c"), (core::String it) → core::String => it);
+static method A|myMap<T extends core::Object? = dynamic, R extends core::Object? = dynamic>(lowered final core::List<self::A|myMap::T%> #this, (self::A|myMap::T%) → self::A|myMap::R% block) → core::List<self::A|myMap::R%> {
+  return #this.{core::Iterable::map}<self::A|myMap::R%>(block){((self::A|myMap::T%) → self::A|myMap::R%) → core::Iterable<self::A|myMap::R%>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<self::A|myMap::R%>};
 }
-static method A|get#myMap<T extends core::Object* = dynamic>(lowered final core::List<self::A|get#myMap::T*>* #this) → <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R*) →* core::List<R*>*
-  return <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R* block) → core::List<R*>* => self::A|myMap<self::A|get#myMap::T*, R*>(#this, block);
+static method A|get#myMap<T extends core::Object? = dynamic>(lowered final core::List<self::A|get#myMap::T%> #this) → <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R%) → core::List<R%>
+  return <R extends core::Object? = dynamic>((self::A|get#myMap::T%) → R% block) → core::List<R%> => self::A|myMap<self::A|get#myMap::T%, R%>(#this, block);
 static method main() → dynamic {
   core::print(self::list);
 }
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart b/pkg/front_end/testcases/extensions/issue38915.dart
index 3792c68..5d4752d 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart
+++ b/pkg/front_end/testcases/extensions/issue38915.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline.expect
index faa81ba..349b61f 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline_modelled.expect
index faa81ba..349b61f 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.weak.expect b/pkg/front_end/testcases/extensions/issue38915.dart.weak.expect
index ab76811..2cb1c05 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.weak.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
@@ -27,22 +17,22 @@
   method method4 = self::Extension|method4;
   tearoff method4 = self::Extension|get#method4;
 }
-static method Extension|method1(lowered final self::Class* #this, {core::bool* b = #C1, core::String* s = #C2}) → void
+static method Extension|method1(lowered final self::Class #this, {core::bool b = #C1, core::String s = #C2}) → void
   return null;
-static method Extension|get#method1(lowered final self::Class* #this) → ({b: core::bool*, s: core::String*}) →* void
-  return ({core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
-static method Extension|method2(lowered final self::Class* #this, [core::bool* b = #C1, core::String* s = #C2]) → void
+static method Extension|get#method1(lowered final self::Class #this) → ({b: core::bool, s: core::String}) → void
+  return ({core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
+static method Extension|method2(lowered final self::Class #this, [core::bool b = #C1, core::String s = #C2]) → void
   return null;
-static method Extension|get#method2(lowered final self::Class* #this) → ([core::bool*, core::String*]) →* void
-  return ([core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method2(#this, b, s);
-static method Extension|method3(lowered final self::Class* #this, core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void {}
-static method Extension|get#method3(lowered final self::Class* #this) → (core::int*, {b: core::bool*, s: core::String*}) →* void
-  return (core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
-static method Extension|method4(lowered final self::Class* #this, core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void {}
-static method Extension|get#method4(lowered final self::Class* #this) → (core::int*, [core::bool*, core::String*]) →* void
-  return (core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method4(#this, i, b, s);
+static method Extension|get#method2(lowered final self::Class #this) → ([core::bool, core::String]) → void
+  return ([core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method2(#this, b, s);
+static method Extension|method3(lowered final self::Class #this, core::int i, {core::bool b = #C1, core::String s = #C2}) → void {}
+static method Extension|get#method3(lowered final self::Class #this) → (core::int, {b: core::bool, s: core::String}) → void
+  return (core::int i, {core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
+static method Extension|method4(lowered final self::Class #this, core::int i, [core::bool b = #C1, core::String s = #C2]) → void {}
+static method Extension|get#method4(lowered final self::Class #this) → (core::int, [core::bool, core::String]) → void
+  return (core::int i, [core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method4(#this, i, b, s);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::Extension|method1(c);
   self::Extension|method1(c, s: "foo");
   self::Extension|method1(c, b: true);
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect
index ab76811..2cb1c05 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
@@ -27,22 +17,22 @@
   method method4 = self::Extension|method4;
   tearoff method4 = self::Extension|get#method4;
 }
-static method Extension|method1(lowered final self::Class* #this, {core::bool* b = #C1, core::String* s = #C2}) → void
+static method Extension|method1(lowered final self::Class #this, {core::bool b = #C1, core::String s = #C2}) → void
   return null;
-static method Extension|get#method1(lowered final self::Class* #this) → ({b: core::bool*, s: core::String*}) →* void
-  return ({core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
-static method Extension|method2(lowered final self::Class* #this, [core::bool* b = #C1, core::String* s = #C2]) → void
+static method Extension|get#method1(lowered final self::Class #this) → ({b: core::bool, s: core::String}) → void
+  return ({core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
+static method Extension|method2(lowered final self::Class #this, [core::bool b = #C1, core::String s = #C2]) → void
   return null;
-static method Extension|get#method2(lowered final self::Class* #this) → ([core::bool*, core::String*]) →* void
-  return ([core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method2(#this, b, s);
-static method Extension|method3(lowered final self::Class* #this, core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void {}
-static method Extension|get#method3(lowered final self::Class* #this) → (core::int*, {b: core::bool*, s: core::String*}) →* void
-  return (core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
-static method Extension|method4(lowered final self::Class* #this, core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void {}
-static method Extension|get#method4(lowered final self::Class* #this) → (core::int*, [core::bool*, core::String*]) →* void
-  return (core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method4(#this, i, b, s);
+static method Extension|get#method2(lowered final self::Class #this) → ([core::bool, core::String]) → void
+  return ([core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method2(#this, b, s);
+static method Extension|method3(lowered final self::Class #this, core::int i, {core::bool b = #C1, core::String s = #C2}) → void {}
+static method Extension|get#method3(lowered final self::Class #this) → (core::int, {b: core::bool, s: core::String}) → void
+  return (core::int i, {core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
+static method Extension|method4(lowered final self::Class #this, core::int i, [core::bool b = #C1, core::String s = #C2]) → void {}
+static method Extension|get#method4(lowered final self::Class #this) → (core::int, [core::bool, core::String]) → void
+  return (core::int i, [core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method4(#this, i, b, s);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::Extension|method1(c);
   self::Extension|method1(c, s: "foo");
   self::Extension|method1(c, b: true);
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue38915.dart.weak.outline.expect
index 7a5e057..41779cc 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.weak.outline.expect
@@ -1,22 +1,12 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
@@ -26,21 +16,21 @@
   method method4 = self::Extension|method4;
   tearoff method4 = self::Extension|get#method4;
 }
-static method Extension|method1(lowered final self::Class* #this, {has-declared-initializer core::bool* b, has-declared-initializer core::String* s}) → void
+static method Extension|method1(lowered final self::Class #this, {has-declared-initializer core::bool b, has-declared-initializer core::String s}) → void
   ;
-static method Extension|get#method1(lowered final self::Class* #this) → ({b: core::bool*, s: core::String*}) →* void
-  return ({core::bool* b, core::String* s}) → void => self::Extension|method1(#this, b: b, s: s);
-static method Extension|method2(lowered final self::Class* #this, [has-declared-initializer core::bool* b, has-declared-initializer core::String* s]) → void
+static method Extension|get#method1(lowered final self::Class #this) → ({b: core::bool, s: core::String}) → void
+  return ({core::bool b, core::String s}) → void => self::Extension|method1(#this, b: b, s: s);
+static method Extension|method2(lowered final self::Class #this, [has-declared-initializer core::bool b, has-declared-initializer core::String s]) → void
   ;
-static method Extension|get#method2(lowered final self::Class* #this) → ([core::bool*, core::String*]) →* void
-  return ([core::bool* b, core::String* s]) → void => self::Extension|method2(#this, b, s);
-static method Extension|method3(lowered final self::Class* #this, core::int* i, {has-declared-initializer core::bool* b, has-declared-initializer core::String* s}) → void
+static method Extension|get#method2(lowered final self::Class #this) → ([core::bool, core::String]) → void
+  return ([core::bool b, core::String s]) → void => self::Extension|method2(#this, b, s);
+static method Extension|method3(lowered final self::Class #this, core::int i, {has-declared-initializer core::bool b, has-declared-initializer core::String s}) → void
   ;
-static method Extension|get#method3(lowered final self::Class* #this) → (core::int*, {b: core::bool*, s: core::String*}) →* void
-  return (core::int* i, {core::bool* b, core::String* s}) → void => self::Extension|method3(#this, i, b: b, s: s);
-static method Extension|method4(lowered final self::Class* #this, core::int* i, [has-declared-initializer core::bool* b, has-declared-initializer core::String* s]) → void
+static method Extension|get#method3(lowered final self::Class #this) → (core::int, {b: core::bool, s: core::String}) → void
+  return (core::int i, {core::bool b, core::String s}) → void => self::Extension|method3(#this, i, b: b, s: s);
+static method Extension|method4(lowered final self::Class #this, core::int i, [has-declared-initializer core::bool b, has-declared-initializer core::String s]) → void
   ;
-static method Extension|get#method4(lowered final self::Class* #this) → (core::int*, [core::bool*, core::String*]) →* void
-  return (core::int* i, [core::bool* b, core::String* s]) → void => self::Extension|method4(#this, i, b, s);
+static method Extension|get#method4(lowered final self::Class #this) → (core::int, [core::bool, core::String]) → void
+  return (core::int i, [core::bool b, core::String s]) → void => self::Extension|method4(#this, i, b, s);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue38915.dart.weak.transformed.expect
index ab76811..2cb1c05 100644
--- a/pkg/front_end/testcases/extensions/issue38915.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.weak.transformed.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
@@ -27,22 +17,22 @@
   method method4 = self::Extension|method4;
   tearoff method4 = self::Extension|get#method4;
 }
-static method Extension|method1(lowered final self::Class* #this, {core::bool* b = #C1, core::String* s = #C2}) → void
+static method Extension|method1(lowered final self::Class #this, {core::bool b = #C1, core::String s = #C2}) → void
   return null;
-static method Extension|get#method1(lowered final self::Class* #this) → ({b: core::bool*, s: core::String*}) →* void
-  return ({core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
-static method Extension|method2(lowered final self::Class* #this, [core::bool* b = #C1, core::String* s = #C2]) → void
+static method Extension|get#method1(lowered final self::Class #this) → ({b: core::bool, s: core::String}) → void
+  return ({core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
+static method Extension|method2(lowered final self::Class #this, [core::bool b = #C1, core::String s = #C2]) → void
   return null;
-static method Extension|get#method2(lowered final self::Class* #this) → ([core::bool*, core::String*]) →* void
-  return ([core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method2(#this, b, s);
-static method Extension|method3(lowered final self::Class* #this, core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void {}
-static method Extension|get#method3(lowered final self::Class* #this) → (core::int*, {b: core::bool*, s: core::String*}) →* void
-  return (core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
-static method Extension|method4(lowered final self::Class* #this, core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void {}
-static method Extension|get#method4(lowered final self::Class* #this) → (core::int*, [core::bool*, core::String*]) →* void
-  return (core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method4(#this, i, b, s);
+static method Extension|get#method2(lowered final self::Class #this) → ([core::bool, core::String]) → void
+  return ([core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method2(#this, b, s);
+static method Extension|method3(lowered final self::Class #this, core::int i, {core::bool b = #C1, core::String s = #C2}) → void {}
+static method Extension|get#method3(lowered final self::Class #this) → (core::int, {b: core::bool, s: core::String}) → void
+  return (core::int i, {core::bool b = #C1, core::String s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
+static method Extension|method4(lowered final self::Class #this, core::int i, [core::bool b = #C1, core::String s = #C2]) → void {}
+static method Extension|get#method4(lowered final self::Class #this) → (core::int, [core::bool, core::String]) → void
+  return (core::int i, [core::bool b = #C1, core::String s = #C2]) → void => self::Extension|method4(#this, i, b, s);
 static method main() → dynamic {
-  self::Class* c = new self::Class::•();
+  self::Class c = new self::Class::•();
   self::Extension|method1(c);
   self::Extension|method1(c, s: "foo");
   self::Extension|method1(c, b: true);
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart b/pkg/front_end/testcases/extensions/issue39527.dart
index 5e2f9cd..7990741 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart
+++ b/pkg/front_end/testcases/extensions/issue39527.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class C {
   int value = 0;
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline.expect
index 3dec874..586004b 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {
   int value = 0;
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline_modelled.expect
index 8a10e4c..56b4c36 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {
   int value = 0;
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.weak.expect b/pkg/front_end/testcases/extensions/issue39527.dart.weak.expect
index 7d9415b..e569e5c 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.weak.expect
@@ -1,39 +1,29 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value = 0;
-  synthetic constructor •() → self::C*
+  field core::int value = 0;
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::C* {
+extension Extension1 on self::C {
   operator [] = self::Extension1|[];
   operator []= = self::Extension1|[]=;
   operator - = self::Extension1|-;
 }
-static method Extension1|[](lowered final self::C* #this, core::int* index) → self::C*
-  return let final self::C* #t1 = #this in block {
-    #t1.{self::C::value} = #t1.{self::C::value}{core::int*}.{core::num::+}(index.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+static method Extension1|[](lowered final self::C #this, core::int index) → self::C
+  return let final self::C #t1 = #this in block {
+    #t1.{self::C::value} = #t1.{self::C::value}{core::int}.{core::num::+}(index.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
   } =>#t1;
-static method Extension1|[]=(lowered final self::C* #this, core::int* index, self::C* other) → void
-  return #this.{self::C::value} = #this.{self::C::value}{core::int*}.{core::num::+}(other.{self::C::value}{core::int*}.{core::num::+}(index){(core::num*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-static method Extension1|-(lowered final self::C* #this, core::int* val) → self::C*
+static method Extension1|[]=(lowered final self::C #this, core::int index, self::C other) → void
+  return #this.{self::C::value} = #this.{self::C::value}{core::int}.{core::num::+}(other.{self::C::value}{core::int}.{core::num::+}(index){(core::num) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
+static method Extension1|-(lowered final self::C #this, core::int val) → self::C
   return #this;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t2 = c in let final core::int* #t3 = 42 in let final self::C* #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
-  let final self::C* #t6 = c in let final core::int* #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
+  self::C c = new self::C::•();
+  let final self::C #t2 = c in let final core::int #t3 = 42 in let final self::C #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
+  let final self::C #t6 = c in let final core::int #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect
index 7d9415b..e569e5c 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect
@@ -1,39 +1,29 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value = 0;
-  synthetic constructor •() → self::C*
+  field core::int value = 0;
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::C* {
+extension Extension1 on self::C {
   operator [] = self::Extension1|[];
   operator []= = self::Extension1|[]=;
   operator - = self::Extension1|-;
 }
-static method Extension1|[](lowered final self::C* #this, core::int* index) → self::C*
-  return let final self::C* #t1 = #this in block {
-    #t1.{self::C::value} = #t1.{self::C::value}{core::int*}.{core::num::+}(index.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+static method Extension1|[](lowered final self::C #this, core::int index) → self::C
+  return let final self::C #t1 = #this in block {
+    #t1.{self::C::value} = #t1.{self::C::value}{core::int}.{core::num::+}(index.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
   } =>#t1;
-static method Extension1|[]=(lowered final self::C* #this, core::int* index, self::C* other) → void
-  return #this.{self::C::value} = #this.{self::C::value}{core::int*}.{core::num::+}(other.{self::C::value}{core::int*}.{core::num::+}(index){(core::num*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-static method Extension1|-(lowered final self::C* #this, core::int* val) → self::C*
+static method Extension1|[]=(lowered final self::C #this, core::int index, self::C other) → void
+  return #this.{self::C::value} = #this.{self::C::value}{core::int}.{core::num::+}(other.{self::C::value}{core::int}.{core::num::+}(index){(core::num) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
+static method Extension1|-(lowered final self::C #this, core::int val) → self::C
   return #this;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t2 = c in let final core::int* #t3 = 42 in let final self::C* #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
-  let final self::C* #t6 = c in let final core::int* #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
+  self::C c = new self::C::•();
+  let final self::C #t2 = c in let final core::int #t3 = 42 in let final self::C #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
+  let final self::C #t6 = c in let final core::int #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue39527.dart.weak.outline.expect
index 32185bf..c414d72 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.weak.outline.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value;
-  synthetic constructor •() → self::C*
+  field core::int value;
+  synthetic constructor •() → self::C
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::C* {
+extension Extension1 on self::C {
   operator [] = self::Extension1|[];
   operator []= = self::Extension1|[]=;
   operator - = self::Extension1|-;
 }
-static method Extension1|[](lowered final self::C* #this, core::int* index) → self::C*
+static method Extension1|[](lowered final self::C #this, core::int index) → self::C
   ;
-static method Extension1|[]=(lowered final self::C* #this, core::int* index, self::C* other) → void
+static method Extension1|[]=(lowered final self::C #this, core::int index, self::C other) → void
   ;
-static method Extension1|-(lowered final self::C* #this, core::int* val) → self::C*
+static method Extension1|-(lowered final self::C #this, core::int val) → self::C
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.weak.transformed.expect
index f952880..c864b44 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.weak.transformed.expect
@@ -1,40 +1,30 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value = 0;
-  synthetic constructor •() → self::C*
+  field core::int value = 0;
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1 on self::C* {
+extension Extension1 on self::C {
   operator [] = self::Extension1|[];
   operator []= = self::Extension1|[]=;
   operator - = self::Extension1|-;
 }
-static method Extension1|[](lowered final self::C* #this, core::int* index) → self::C*
-  return let final self::C* #t1 = #this in block {
-    #t1.{self::C::value} = #t1.{self::C::value}{core::int*}.{core::num::+}(index.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+static method Extension1|[](lowered final self::C #this, core::int index) → self::C
+  return let final self::C #t1 = #this in block {
+    #t1.{self::C::value} = #t1.{self::C::value}{core::int}.{core::num::+}(index.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
   } =>#t1;
-static method Extension1|[]=(lowered final self::C* #this, core::int* index, self::C* other) → void
-  return #this.{self::C::value} = #this.{self::C::value}{core::int*}.{core::num::+}(other.{self::C::value}{core::int*}.{core::num::+}(index){(core::num*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-static method Extension1|-(lowered final self::C* #this, core::int* val) → self::C*
+static method Extension1|[]=(lowered final self::C #this, core::int index, self::C other) → void
+  return #this.{self::C::value} = #this.{self::C::value}{core::int}.{core::num::+}(other.{self::C::value}{core::int}.{core::num::+}(index){(core::num) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::num) → core::int};
+static method Extension1|-(lowered final self::C #this, core::int val) → self::C
   return #this;
 static method main() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t2 = c in let final core::int* #t3 = 42 in let final self::C* #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
-  let final self::C* #t6 = c in let final core::int* #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
+  self::C c = new self::C::•();
+  let final self::C #t2 = c in let final core::int #t3 = 42 in let final self::C #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
+  let final self::C #t6 = c in let final core::int #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
 
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart b/pkg/front_end/testcases/extensions/issue39889.dart
index f53be7d..7ff900b 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart
+++ b/pkg/front_end/testcases/extensions/issue39889.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class C {}
 
 extension E on C {
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline.expect
index 87bc816..2b64dea 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {}
 
 extension E on C {
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline_modelled.expect
index 87bc816..2b64dea 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {}
 
 extension E on C {
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.weak.expect b/pkg/front_end/testcases/extensions/issue39889.dart.weak.expect
index 3d65b0f..42c94d0 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.weak.expect
@@ -1,31 +1,21 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   method f = self::E|f;
   tearoff f = self::E|get#f;
 }
-static method E|f(lowered final self::C* #this, core::String* b) → void {}
-static method E|get#f(lowered final self::C* #this) → (core::String*) →* void
-  return (core::String* b) → void => self::E|f(#this, b);
+static method E|f(lowered final self::C #this, core::String b) → void {}
+static method E|get#f(lowered final self::C #this) → (core::String) → void
+  return (core::String b) → void => self::E|f(#this, b);
 static method main() → void {
   dynamic b = "456";
-  self::C* c = new self::C::•();
-  self::E|f(c, b as{TypeError,ForDynamic} core::String*);
+  self::C c = new self::C::•();
+  self::E|f(c, b as{TypeError,ForDynamic,ForNonNullableByDefault} core::String);
 }
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect
index 3d65b0f..42c94d0 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect
@@ -1,31 +1,21 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   method f = self::E|f;
   tearoff f = self::E|get#f;
 }
-static method E|f(lowered final self::C* #this, core::String* b) → void {}
-static method E|get#f(lowered final self::C* #this) → (core::String*) →* void
-  return (core::String* b) → void => self::E|f(#this, b);
+static method E|f(lowered final self::C #this, core::String b) → void {}
+static method E|get#f(lowered final self::C #this) → (core::String) → void
+  return (core::String b) → void => self::E|f(#this, b);
 static method main() → void {
   dynamic b = "456";
-  self::C* c = new self::C::•();
-  self::E|f(c, b as{TypeError,ForDynamic} core::String*);
+  self::C c = new self::C::•();
+  self::E|f(c, b as{TypeError,ForDynamic,ForNonNullableByDefault} core::String);
 }
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue39889.dart.weak.outline.expect
index 0569c0a..3f7e42e 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.weak.outline.expect
@@ -1,28 +1,18 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   method f = self::E|f;
   tearoff f = self::E|get#f;
 }
-static method E|f(lowered final self::C* #this, core::String* b) → void
+static method E|f(lowered final self::C #this, core::String b) → void
   ;
-static method E|get#f(lowered final self::C* #this) → (core::String*) →* void
-  return (core::String* b) → void => self::E|f(#this, b);
+static method E|get#f(lowered final self::C #this) → (core::String) → void
+  return (core::String b) → void => self::E|f(#this, b);
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue39889.dart.weak.transformed.expect
index 3d65b0f..42c94d0 100644
--- a/pkg/front_end/testcases/extensions/issue39889.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.weak.transformed.expect
@@ -1,31 +1,21 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C*
+  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E on self::C* {
+extension E on self::C {
   method f = self::E|f;
   tearoff f = self::E|get#f;
 }
-static method E|f(lowered final self::C* #this, core::String* b) → void {}
-static method E|get#f(lowered final self::C* #this) → (core::String*) →* void
-  return (core::String* b) → void => self::E|f(#this, b);
+static method E|f(lowered final self::C #this, core::String b) → void {}
+static method E|get#f(lowered final self::C #this) → (core::String) → void
+  return (core::String b) → void => self::E|f(#this, b);
 static method main() → void {
   dynamic b = "456";
-  self::C* c = new self::C::•();
-  self::E|f(c, b as{TypeError,ForDynamic} core::String*);
+  self::C c = new self::C::•();
+  self::E|f(c, b as{TypeError,ForDynamic,ForNonNullableByDefault} core::String);
 }
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart
index d78f27a..5a39748 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'issue39938_lib.dart';
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline.expect
index 19911dd..5a7bb14 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'issue39938_lib.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline_modelled.expect
index 416331d..55e3b57 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'issue39938_lib.dart';
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.expect
index aef46a0..9381fe1 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "issue39938_lib.dart" as iss;
 import "dart:core" as core;
@@ -16,16 +16,16 @@
   self::expect(false, iss::Extension|+(false, false));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}.";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as iss;
 import "dart:core" as core;
 
-extension Extension on core::bool* {
+extension Extension on core::bool {
   operator + = iss::Extension|+;
 }
-static method Extension|+(lowered final core::bool* #this, core::bool* other) → core::bool*
-  return #this.{core::bool::|}(other){(core::bool*) →* core::bool*};
+static method Extension|+(lowered final core::bool #this, core::bool other) → core::bool
+  return #this.{core::bool::|}(other){(core::bool) → core::bool};
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect
index 1c4dd76..4a69c8b 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "issue39938_lib.dart" as iss;
 import "dart:core" as core;
@@ -16,6 +16,6 @@
   self::expect(false, iss::Extension|+(false, false));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}.";
 }
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.outline.expect
index 975b7b2..1905de9 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///issue39938_lib.dart";
@@ -8,12 +8,12 @@
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension Extension on core::bool* {
+extension Extension on core::bool {
   operator + = self2::Extension|+;
 }
-static method Extension|+(lowered final core::bool* #this, core::bool* other) → core::bool*
+static method Extension|+(lowered final core::bool #this, core::bool other) → core::bool
   ;
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.transformed.expect
index aef46a0..9381fe1 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "issue39938_lib.dart" as iss;
 import "dart:core" as core;
@@ -16,16 +16,16 @@
   self::expect(false, iss::Extension|+(false, false));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}.";
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as iss;
 import "dart:core" as core;
 
-extension Extension on core::bool* {
+extension Extension on core::bool {
   operator + = iss::Extension|+;
 }
-static method Extension|+(lowered final core::bool* #this, core::bool* other) → core::bool*
-  return #this.{core::bool::|}(other){(core::bool*) →* core::bool*};
+static method Extension|+(lowered final core::bool #this, core::bool other) → core::bool
+  return #this.{core::bool::|}(other){(core::bool) → core::bool};
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938_lib.dart b/pkg/front_end/testcases/extensions/issue39938/issue39938_lib.dart
index da0e29f..8f2588e 100644
--- a/pkg/front_end/testcases/extensions/issue39938/issue39938_lib.dart
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938_lib.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension Extension on bool {
   bool operator +(bool other) => this | other;
 }
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart b/pkg/front_end/testcases/extensions/issue40596.dart
index fd0c1c1..733236c 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart
+++ b/pkg/front_end/testcases/extensions/issue40596.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'dart:async';
 
 void main() {
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline.expect
index ce04073..ee456e8 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'dart:async';
 
 void main() {}
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline_modelled.expect
index 15839ab..a5b08bb 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'dart:async';
 
 extension Extension<T> on Stream<T> {
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
index 4f80fad..ca760ff 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.expect
@@ -1,24 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-extension Extension<T extends core::Object* = dynamic> on asy::Stream<T*>* {
+extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
 static method main() → void {
-  asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
+  asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
+  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}{asy::Stream<core::String*>*}, #t2);
+  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
+static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
+  return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {
     onData(d);
-  }){((self::Extension|call::T*) →* void, {cancelOnError: core::bool*, onDone: () →* void, onError: core::Function*}) →* asy::StreamSubscription<self::Extension|call::T*>*};
+  }){((self::Extension|call::T%) →? void, {cancelOnError: core::bool?, onDone: () →? void, onError: core::Function?}) → asy::StreamSubscription<self::Extension|call::T%>};
 }
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|get#call::T*>* #this) → (core::Function*) →* asy::StreamSubscription<self::Extension|get#call::T*>*
-  return (core::Function* onData) → asy::StreamSubscription<self::Extension|get#call::T*>* => self::Extension|call<self::Extension|get#call::T*>(#this, onData);
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|get#call::T%> #this) → (core::Function) → asy::StreamSubscription<self::Extension|get#call::T%>
+  return (core::Function onData) → asy::StreamSubscription<self::Extension|get#call::T%> => self::Extension|call<self::Extension|get#call::T%>(#this, onData);
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
index 4f80fad..ca760ff 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
@@ -1,24 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-extension Extension<T extends core::Object* = dynamic> on asy::Stream<T*>* {
+extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
 static method main() → void {
-  asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
+  asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
+  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}{asy::Stream<core::String*>*}, #t2);
+  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
+static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
+  return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {
     onData(d);
-  }){((self::Extension|call::T*) →* void, {cancelOnError: core::bool*, onDone: () →* void, onError: core::Function*}) →* asy::StreamSubscription<self::Extension|call::T*>*};
+  }){((self::Extension|call::T%) →? void, {cancelOnError: core::bool?, onDone: () →? void, onError: core::Function?}) → asy::StreamSubscription<self::Extension|call::T%>};
 }
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|get#call::T*>* #this) → (core::Function*) →* asy::StreamSubscription<self::Extension|get#call::T*>*
-  return (core::Function* onData) → asy::StreamSubscription<self::Extension|get#call::T*>* => self::Extension|call<self::Extension|get#call::T*>(#this, onData);
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|get#call::T%> #this) → (core::Function) → asy::StreamSubscription<self::Extension|get#call::T%>
+  return (core::Function onData) → asy::StreamSubscription<self::Extension|get#call::T%> => self::Extension|call<self::Extension|get#call::T%>(#this, onData);
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.outline.expect
index 8be7c09..c40dae2 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.outline.expect
@@ -1,17 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-extension Extension<T extends core::Object* = dynamic> on asy::Stream<T*>* {
+extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
 static method main() → void
   ;
-static method Extension|call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>*
+static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%>
   ;
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|get#call::T*>* #this) → (core::Function*) →* asy::StreamSubscription<self::Extension|get#call::T*>*
-  return (core::Function* onData) → asy::StreamSubscription<self::Extension|get#call::T*>* => self::Extension|call<self::Extension|get#call::T*>(#this, onData);
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|get#call::T%> #this) → (core::Function) → asy::StreamSubscription<self::Extension|get#call::T%>
+  return (core::Function onData) → asy::StreamSubscription<self::Extension|get#call::T%> => self::Extension|call<self::Extension|get#call::T%>(#this, onData);
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
index 4f80fad..ca760ff 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.transformed.expect
@@ -1,24 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
 
 import "dart:async";
 
-extension Extension<T extends core::Object* = dynamic> on asy::Stream<T*>* {
+extension Extension<T extends core::Object? = dynamic> on asy::Stream<T%> {
   method call = self::Extension|call;
   tearoff call = self::Extension|get#call;
 }
 static method main() → void {
-  asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
+  asy::StreamController<core::String> controller = asy::StreamController::•<core::String>();
+  let final asy::StreamController<core::String> #t1 = controller in let final (dynamic) → Null #t2 = (dynamic s) → Null {
     core::print(s);
-  } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}{asy::Stream<core::String*>*}, #t2);
+  } in self::Extension|call<core::String>(#t1.{asy::StreamController::stream}{asy::Stream<core::String>}, #t2);
 }
-static method Extension|call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
+static method Extension|call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|call::T%> #this, core::Function onData) → asy::StreamSubscription<self::Extension|call::T%> {
+  return #this.{asy::Stream::listen}((self::Extension|call::T% d) → void {
     onData(d);
-  }){((self::Extension|call::T*) →* void, {cancelOnError: core::bool*, onDone: () →* void, onError: core::Function*}) →* asy::StreamSubscription<self::Extension|call::T*>*};
+  }){((self::Extension|call::T%) →? void, {cancelOnError: core::bool?, onDone: () →? void, onError: core::Function?}) → asy::StreamSubscription<self::Extension|call::T%>};
 }
-static method Extension|get#call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|get#call::T*>* #this) → (core::Function*) →* asy::StreamSubscription<self::Extension|get#call::T*>*
-  return (core::Function* onData) → asy::StreamSubscription<self::Extension|get#call::T*>* => self::Extension|call<self::Extension|get#call::T*>(#this, onData);
+static method Extension|get#call<T extends core::Object? = dynamic>(lowered final asy::Stream<self::Extension|get#call::T%> #this) → (core::Function) → asy::StreamSubscription<self::Extension|get#call::T%>
+  return (core::Function onData) → asy::StreamSubscription<self::Extension|get#call::T%> => self::Extension|call<self::Extension|get#call::T%>(#this, onData);
diff --git a/pkg/front_end/testcases/extensions/issue40713.dart b/pkg/front_end/testcases/extensions/issue40713.dart
index 04e924b..3ce25ad 100644
--- a/pkg/front_end/testcases/extensions/issue40713.dart
+++ b/pkg/front_end/testcases/extensions/issue40713.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 extension SafeAccess<T> on Iterable<T> {
   T get safeFirst {
     return isNotEmpty ? first : null;
diff --git a/pkg/front_end/testcases/extensions/issue40713.dart.weak.expect b/pkg/front_end/testcases/extensions/issue40713.dart.weak.expect
index 568f207..dcea3fb 100644
--- a/pkg/front_end/testcases/extensions/issue40713.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue40713.dart.weak.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
 //   list.safeFirst();
 //        ^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
 //   list2.safeFirst();
 //                  ^
 //
@@ -28,11 +28,11 @@
 }
 static method errors() → void {
   final core::List<core::Object*>* list = <core::Object*>[];
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
   list.safeFirst();
        ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object*>(list){<unresolved>}.call();
   final core::List<(core::int*) →* void>* list2 = <(core::int*) →* void>[];
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
   list2.safeFirst();
                  ^" in self::SafeAccess|get#safeFirst<(core::int*) →* void>(list2){<inapplicable>}.();
 }
diff --git a/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect
index 568f207..dcea3fb 100644
--- a/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
 //   list.safeFirst();
 //        ^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
 //   list2.safeFirst();
 //                  ^
 //
@@ -28,11 +28,11 @@
 }
 static method errors() → void {
   final core::List<core::Object*>* list = <core::Object*>[];
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
   list.safeFirst();
        ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object*>(list){<unresolved>}.call();
   final core::List<(core::int*) →* void>* list2 = <(core::int*) →* void>[];
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
   list2.safeFirst();
                  ^" in self::SafeAccess|get#safeFirst<(core::int*) →* void>(list2){<inapplicable>}.();
 }
diff --git a/pkg/front_end/testcases/extensions/issue40713.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue40713.dart.weak.transformed.expect
index 7dc278b..70bb82b 100644
--- a/pkg/front_end/testcases/extensions/issue40713.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40713.dart.weak.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
 //   list.safeFirst();
 //        ^^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+// pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
 //   list2.safeFirst();
 //                  ^
 //
@@ -28,11 +28,11 @@
 }
 static method errors() → void {
   final core::List<core::Object*>* list = core::_GrowableList::•<core::Object*>(0);
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
   list.safeFirst();
        ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object*>(list){<unresolved>}.call();
   final core::List<(core::int*) →* void>* list2 = core::_GrowableList::•<(core::int*) →* void>(0);
-  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:26:18: Error: Too few positional arguments: 1 required, 0 given.
   list2.safeFirst();
                  ^" in self::SafeAccess|get#safeFirst<(core::int*) →* void>(list2){<inapplicable>}.();
 }
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart b/pkg/front_end/testcases/extensions/issue40713_2.dart
new file mode 100644
index 0000000..0c5438d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension SafeAccess<T> on Iterable<T> {
+  T get safeFirst {
+    return isNotEmpty ? first : throw '';
+  }
+}
+
+main() {}
+
+void test() {
+  final list = [];
+  list.safeFirst();
+  final list2 = <void Function(int)>[];
+  list2.safeFirst(0);
+}
+
+void errors() {
+  final list = <Object>[];
+  list.safeFirst();
+  final list2 = <void Function(int)>[];
+  list2.safeFirst();
+}
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline.expect
new file mode 100644
index 0000000..86e8aaa
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+extension SafeAccess<T> on Iterable<T> {
+  T get safeFirst {}
+}
+
+main() {}
+void test() {}
+void errors() {}
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b4b03d34
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+extension SafeAccess<T> on Iterable<T> {
+  T get safeFirst {}
+}
+
+main() {}
+void errors() {}
+void test() {}
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.expect
new file mode 100644
index 0000000..c28459e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+//   list.safeFirst();
+//        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+//   list2.safeFirst();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension SafeAccess<T extends core::Object? = dynamic> on core::Iterable<T%> {
+  get safeFirst = self::SafeAccess|get#safeFirst;
+}
+static method SafeAccess|get#safeFirst<T extends core::Object? = dynamic>(lowered final core::Iterable<self::SafeAccess|get#safeFirst::T%> #this) → self::SafeAccess|get#safeFirst::T% {
+  return #this.{core::Iterable::isNotEmpty}{core::bool} ?{self::SafeAccess|get#safeFirst::T%} #this.{core::Iterable::first}{self::SafeAccess|get#safeFirst::T%} : throw "";
+}
+static method main() → dynamic {}
+static method test() → void {
+  final core::List<dynamic> list = <dynamic>[];
+  self::SafeAccess|get#safeFirst<dynamic>(list){dynamic}.call();
+  final core::List<(core::int) → void> list2 = <(core::int) → void>[];
+  self::SafeAccess|get#safeFirst<(core::int) → void>(list2)(0){(core::int) → void};
+}
+static method errors() → void {
+  final core::List<core::Object> list = <core::Object>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  list.safeFirst();
+       ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object>(list){<unresolved>}.call();
+  final core::List<(core::int) → void> list2 = <(core::int) → void>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  list2.safeFirst();
+                 ^" in self::SafeAccess|get#safeFirst<(core::int) → void>(list2){<inapplicable>}.();
+}
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.modular.expect
new file mode 100644
index 0000000..c28459e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+//   list.safeFirst();
+//        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+//   list2.safeFirst();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension SafeAccess<T extends core::Object? = dynamic> on core::Iterable<T%> {
+  get safeFirst = self::SafeAccess|get#safeFirst;
+}
+static method SafeAccess|get#safeFirst<T extends core::Object? = dynamic>(lowered final core::Iterable<self::SafeAccess|get#safeFirst::T%> #this) → self::SafeAccess|get#safeFirst::T% {
+  return #this.{core::Iterable::isNotEmpty}{core::bool} ?{self::SafeAccess|get#safeFirst::T%} #this.{core::Iterable::first}{self::SafeAccess|get#safeFirst::T%} : throw "";
+}
+static method main() → dynamic {}
+static method test() → void {
+  final core::List<dynamic> list = <dynamic>[];
+  self::SafeAccess|get#safeFirst<dynamic>(list){dynamic}.call();
+  final core::List<(core::int) → void> list2 = <(core::int) → void>[];
+  self::SafeAccess|get#safeFirst<(core::int) → void>(list2)(0){(core::int) → void};
+}
+static method errors() → void {
+  final core::List<core::Object> list = <core::Object>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  list.safeFirst();
+       ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object>(list){<unresolved>}.call();
+  final core::List<(core::int) → void> list2 = <(core::int) → void>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  list2.safeFirst();
+                 ^" in self::SafeAccess|get#safeFirst<(core::int) → void>(list2){<inapplicable>}.();
+}
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.outline.expect
new file mode 100644
index 0000000..5e4f544
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension SafeAccess<T extends core::Object? = dynamic> on core::Iterable<T%> {
+  get safeFirst = self::SafeAccess|get#safeFirst;
+}
+static method SafeAccess|get#safeFirst<T extends core::Object? = dynamic>(lowered final core::Iterable<self::SafeAccess|get#safeFirst::T%> #this) → self::SafeAccess|get#safeFirst::T%
+  ;
+static method main() → dynamic
+  ;
+static method test() → void
+  ;
+static method errors() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..4cb53ee
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713_2.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+//   list.safeFirst();
+//        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+//   list2.safeFirst();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension SafeAccess<T extends core::Object? = dynamic> on core::Iterable<T%> {
+  get safeFirst = self::SafeAccess|get#safeFirst;
+}
+static method SafeAccess|get#safeFirst<T extends core::Object? = dynamic>(lowered final core::Iterable<self::SafeAccess|get#safeFirst::T%> #this) → self::SafeAccess|get#safeFirst::T% {
+  return #this.{core::Iterable::isNotEmpty}{core::bool} ?{self::SafeAccess|get#safeFirst::T%} #this.{core::Iterable::first}{self::SafeAccess|get#safeFirst::T%} : throw "";
+}
+static method main() → dynamic {}
+static method test() → void {
+  final core::List<dynamic> list = core::_GrowableList::•<dynamic>(0);
+  self::SafeAccess|get#safeFirst<dynamic>(list){dynamic}.call();
+  final core::List<(core::int) → void> list2 = core::_GrowableList::•<(core::int) → void>(0);
+  self::SafeAccess|get#safeFirst<(core::int) → void>(list2)(0){(core::int) → void};
+}
+static method errors() → void {
+  final core::List<core::Object> list = core::_GrowableList::•<core::Object>(0);
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  list.safeFirst();
+       ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object>(list){<unresolved>}.call();
+  final core::List<(core::int) → void> list2 = core::_GrowableList::•<(core::int) → void>(0);
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713_2.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  list2.safeFirst();
+                 ^" in self::SafeAccess|get#safeFirst<(core::int) → void>(list2){<inapplicable>}.();
+}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart b/pkg/front_end/testcases/extensions/issue40816.dart
index 99ec5d2..9e85e2c 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart
+++ b/pkg/front_end/testcases/extensions/issue40816.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A {}
 
 class B {}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline.expect
index fe13f68..e806109 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A {}
 
 class B {}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline_modelled.expect
index fe13f68..e806109 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A {}
 
 class B {}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.weak.expect b/pkg/front_end/testcases/extensions/issue40816.dart.weak.expect
index 70c933c..e0cb3c1 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.weak.expect
@@ -1,46 +1,26 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::A* {
+extension _extension#0 on self::A {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method _extension#0|foo(lowered final self::A* #this, self::A* a, self::B* b) → void {}
-static method _extension#0|get#foo(lowered final self::A* #this) → (self::A*, self::B*) →* void
-  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method _extension#0|foo(lowered final self::A #this, self::A a, self::B b) → void {}
+static method _extension#0|get#foo(lowered final self::A #this) → (self::A, self::B) → void
+  return (self::A a, self::B b) → void => self::_extension#0|foo(#this, a, b);
 static method main() → void {
   dynamic a = new self::A::•();
   dynamic b = new self::B::•();
-  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic,ForNonNullableByDefault} self::A, b as{TypeError,ForDynamic,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect
index 70c933c..e0cb3c1 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect
@@ -1,46 +1,26 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::A* {
+extension _extension#0 on self::A {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method _extension#0|foo(lowered final self::A* #this, self::A* a, self::B* b) → void {}
-static method _extension#0|get#foo(lowered final self::A* #this) → (self::A*, self::B*) →* void
-  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method _extension#0|foo(lowered final self::A #this, self::A a, self::B b) → void {}
+static method _extension#0|get#foo(lowered final self::A #this) → (self::A, self::B) → void
+  return (self::A a, self::B b) → void => self::_extension#0|foo(#this, a, b);
 static method main() → void {
   dynamic a = new self::A::•();
   dynamic b = new self::B::•();
-  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic,ForNonNullableByDefault} self::A, b as{TypeError,ForDynamic,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue40816.dart.weak.outline.expect
index 6bf9120..bbbf904 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.weak.outline.expect
@@ -1,42 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::A* {
+extension _extension#0 on self::A {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method _extension#0|foo(lowered final self::A* #this, self::A* a, self::B* b) → void
+static method _extension#0|foo(lowered final self::A #this, self::A a, self::B b) → void
   ;
-static method _extension#0|get#foo(lowered final self::A* #this) → (self::A*, self::B*) →* void
-  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method _extension#0|get#foo(lowered final self::A #this) → (self::A, self::B) → void
+  return (self::A a, self::B b) → void => self::_extension#0|foo(#this, a, b);
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue40816.dart.weak.transformed.expect
index 70c933c..e0cb3c1 100644
--- a/pkg/front_end/testcases/extensions/issue40816.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.weak.transformed.expect
@@ -1,46 +1,26 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::A* {
+extension _extension#0 on self::A {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method _extension#0|foo(lowered final self::A* #this, self::A* a, self::B* b) → void {}
-static method _extension#0|get#foo(lowered final self::A* #this) → (self::A*, self::B*) →* void
-  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method _extension#0|foo(lowered final self::A #this, self::A a, self::B b) → void {}
+static method _extension#0|get#foo(lowered final self::A #this) → (self::A, self::B) → void
+  return (self::A a, self::B b) → void => self::_extension#0|foo(#this, a, b);
 static method main() → void {
   dynamic a = new self::A::•();
   dynamic b = new self::B::•();
-  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic,ForNonNullableByDefault} self::A, b as{TypeError,ForDynamic,ForNonNullableByDefault} self::B);
 }
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart b/pkg/front_end/testcases/extensions/issue43218.dart
index d90e5cf..fa413a6 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart
+++ b/pkg/front_end/testcases/extensions/issue43218.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class C {
   int value;
   C() : value = 0 {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline.expect
index 6774e67..c3323e8 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {
   int value;
   C() : value = 0 {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline_modelled.expect
index 1579e1d..6c5f1e6 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class C {
   C() : value = 0 {}
   init() {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.weak.expect b/pkg/front_end/testcases/extensions/issue43218.dart.weak.expect
index 8f03ff9..17263b6 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -11,38 +11,28 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value;
-  constructor •() → self::C*
+  field core::int value;
+  constructor •() → self::C
     : self::C::value = 0, super core::Object::•() {}
   method init() → dynamic {
     this.{self::C::value} = 0;
   }
-  get id() → core::int*
-    return this.{self::C::value}{core::int*};
-  set id(core::int* v) → void {
+  get id() → core::int
+    return this.{self::C::value}{core::int};
+  set id(core::int v) → void {
     this.{self::C::value} = v;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Ext on self::C* {
+extension Ext on self::C {
   get id = self::Ext|get#id;
 }
-static method Ext|get#id(lowered final self::C* #this) → core::int*
-  return #this.{self::C::value}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static method Ext|get#id(lowered final self::C #this) → core::int
+  return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
+  self::C c = new self::C::•();
+  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
   Ext(c).id++;
-         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num*) →* core::int*};
+         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect
index 8f03ff9..17263b6 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -11,38 +11,28 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value;
-  constructor •() → self::C*
+  field core::int value;
+  constructor •() → self::C
     : self::C::value = 0, super core::Object::•() {}
   method init() → dynamic {
     this.{self::C::value} = 0;
   }
-  get id() → core::int*
-    return this.{self::C::value}{core::int*};
-  set id(core::int* v) → void {
+  get id() → core::int
+    return this.{self::C::value}{core::int};
+  set id(core::int v) → void {
     this.{self::C::value} = v;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Ext on self::C* {
+extension Ext on self::C {
   get id = self::Ext|get#id;
 }
-static method Ext|get#id(lowered final self::C* #this) → core::int*
-  return #this.{self::C::value}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static method Ext|get#id(lowered final self::C #this) → core::int
+  return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
+  self::C c = new self::C::•();
+  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
   Ext(c).id++;
-         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num*) →* core::int*};
+         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue43218.dart.weak.outline.expect
index 5ca5e4a..79fab71 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.weak.outline.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value;
-  constructor •() → self::C*
+  field core::int value;
+  constructor •() → self::C
     ;
   method init() → dynamic
     ;
-  get id() → core::int*
+  get id() → core::int
     ;
-  set id(core::int* v) → void
+  set id(core::int v) → void
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Ext on self::C* {
+extension Ext on self::C {
   get id = self::Ext|get#id;
 }
-static method Ext|get#id(lowered final self::C* #this) → core::int*
+static method Ext|get#id(lowered final self::C #this) → core::int
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue43218.dart.weak.transformed.expect
index 8f03ff9..17263b6 100644
--- a/pkg/front_end/testcases/extensions/issue43218.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -11,38 +11,28 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int* value;
-  constructor •() → self::C*
+  field core::int value;
+  constructor •() → self::C
     : self::C::value = 0, super core::Object::•() {}
   method init() → dynamic {
     this.{self::C::value} = 0;
   }
-  get id() → core::int*
-    return this.{self::C::value}{core::int*};
-  set id(core::int* v) → void {
+  get id() → core::int
+    return this.{self::C::value}{core::int};
+  set id(core::int v) → void {
     this.{self::C::value} = v;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Ext on self::C* {
+extension Ext on self::C {
   get id = self::Ext|get#id;
 }
-static method Ext|get#id(lowered final self::C* #this) → core::int*
-  return #this.{self::C::value}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static method Ext|get#id(lowered final self::C #this) → core::int
+  return #this.{self::C::value}{core::int}.{core::num::+}(1){(core::num) → core::int};
 static method test() → dynamic {
-  self::C* c = new self::C::•();
-  let final self::C* #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
+  self::C c = new self::C::•();
+  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
   Ext(c).id++;
-         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num*) →* core::int*};
+         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num) → core::int};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart b/pkg/front_end/testcases/extensions/issue44003.dart
index 01c1fe6..a7a25ed 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart
+++ b/pkg/front_end/testcases/extensions/issue44003.dart
@@ -1,7 +1,7 @@
 // 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.
-// @dart=2.9
+
 void test(List<String> args) {
   args.foo('1', 2);
 }
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline.expect
index c8476d8..c57b097 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 void test(List<String> args) {}
 
 extension on List<String> {
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline_modelled.expect
index 72ed5d4..47d69a0 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension on List<String> {
   void foo(String bar) {}
   void foo(String baz, int a) {}
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.weak.expect b/pkg/front_end/testcases/extensions/issue44003.dart.weak.expect
index a8d4f63..9d6b12e 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -18,20 +18,20 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::List<core::String*>* {
+extension _extension#0 on core::List<core::String> {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method test(core::List<core::String*>* args) → void {
+static method test(core::List<core::String> args) → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44003.dart:6:8: Error: The method 'foo' isn't defined for the class 'List<String>'.
  - 'List' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   args.foo('1', 2);
        ^^^" in args{<unresolved>}.foo("1", 2);
 }
-static method _extension#0|foo(lowered final core::List<core::String*>* #this, core::String* bar) → void {
+static method _extension#0|foo(lowered final core::List<core::String> #this, core::String bar) → void {
   core::print(1);
 }
-static method _extension#0|get#foo(lowered final core::List<core::String*>* #this) → (core::String*) →* void
-  return (core::String* bar) → void => self::_extension#0|foo(#this, bar);
+static method _extension#0|get#foo(lowered final core::List<core::String> #this) → (core::String) → void
+  return (core::String bar) → void => self::_extension#0|foo(#this, bar);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect
index a8d4f63..9d6b12e 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -18,20 +18,20 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::List<core::String*>* {
+extension _extension#0 on core::List<core::String> {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method test(core::List<core::String*>* args) → void {
+static method test(core::List<core::String> args) → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44003.dart:6:8: Error: The method 'foo' isn't defined for the class 'List<String>'.
  - 'List' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   args.foo('1', 2);
        ^^^" in args{<unresolved>}.foo("1", 2);
 }
-static method _extension#0|foo(lowered final core::List<core::String*>* #this, core::String* bar) → void {
+static method _extension#0|foo(lowered final core::List<core::String> #this, core::String bar) → void {
   core::print(1);
 }
-static method _extension#0|get#foo(lowered final core::List<core::String*>* #this) → (core::String*) →* void
-  return (core::String* bar) → void => self::_extension#0|foo(#this, bar);
+static method _extension#0|get#foo(lowered final core::List<core::String> #this) → (core::String) → void
+  return (core::String bar) → void => self::_extension#0|foo(#this, bar);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue44003.dart.weak.outline.expect
index 59eaf76..13d2504 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -12,15 +12,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::List<core::String*>* {
+extension _extension#0 on core::List<core::String> {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method test(core::List<core::String*>* args) → void
+static method test(core::List<core::String> args) → void
   ;
-static method _extension#0|foo(lowered final core::List<core::String*>* #this, core::String* bar) → void
+static method _extension#0|foo(lowered final core::List<core::String> #this, core::String bar) → void
   ;
-static method _extension#0|get#foo(lowered final core::List<core::String*>* #this) → (core::String*) →* void
-  return (core::String* bar) → void => self::_extension#0|foo(#this, bar);
+static method _extension#0|get#foo(lowered final core::List<core::String> #this) → (core::String) → void
+  return (core::String bar) → void => self::_extension#0|foo(#this, bar);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue44003.dart.weak.transformed.expect
index a8d4f63..9d6b12e 100644
--- a/pkg/front_end/testcases/extensions/issue44003.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -18,20 +18,20 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::List<core::String*>* {
+extension _extension#0 on core::List<core::String> {
   method foo = self::_extension#0|foo;
   tearoff foo = self::_extension#0|get#foo;
 }
-static method test(core::List<core::String*>* args) → void {
+static method test(core::List<core::String> args) → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44003.dart:6:8: Error: The method 'foo' isn't defined for the class 'List<String>'.
  - 'List' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   args.foo('1', 2);
        ^^^" in args{<unresolved>}.foo("1", 2);
 }
-static method _extension#0|foo(lowered final core::List<core::String*>* #this, core::String* bar) → void {
+static method _extension#0|foo(lowered final core::List<core::String> #this, core::String bar) → void {
   core::print(1);
 }
-static method _extension#0|get#foo(lowered final core::List<core::String*>* #this) → (core::String*) →* void
-  return (core::String* bar) → void => self::_extension#0|foo(#this, bar);
+static method _extension#0|get#foo(lowered final core::List<core::String> #this) → (core::String) → void
+  return (core::String bar) → void => self::_extension#0|foo(#this, bar);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart b/pkg/front_end/testcases/extensions/issue44844.dart
index afb96ca..14f590b 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart
+++ b/pkg/front_end/testcases/extensions/issue44844.dart
@@ -1,7 +1,7 @@
 // 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.
-// @dart=2.9
+
 extension on int {
   static int foo = 2;
   void foo() {}
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline.expect
index 52d5738..53fe40b 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension on int {
   static int foo = 2;
   void foo() {}
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline_modelled.expect
index 90a72cd..401a830 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension on int {
   static int foo = 2;
   void foo() {}
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.weak.expect b/pkg/front_end/testcases/extensions/issue44844.dart.weak.expect
index 1a705d7..1066ec8 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   static field foo = self::_extension#0|foo;
 }
-static field core::int* _extension#0|foo;
+static field core::int _extension#0|foo;
 static method test() → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44844.dart:11:5: Error: The method 'foo' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect
index 1a705d7..1066ec8 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   static field foo = self::_extension#0|foo;
 }
-static field core::int* _extension#0|foo;
+static field core::int _extension#0|foo;
 static method test() → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44844.dart:11:5: Error: The method 'foo' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue44844.dart.weak.outline.expect
index 33b1925..7c45f04 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -12,10 +12,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   static field foo = self::_extension#0|foo;
 }
-static field core::int* _extension#0|foo;
+static field core::int _extension#0|foo;
 static method test() → void
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue44844.dart.weak.transformed.expect
index 1a705d7..1066ec8 100644
--- a/pkg/front_end/testcases/extensions/issue44844.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -17,10 +17,10 @@
 import self as self;
 import "dart:core" as core;
 
-extension _extension#0 on core::int* {
+extension _extension#0 on core::int {
   static field foo = self::_extension#0|foo;
 }
-static field core::int* _extension#0|foo;
+static field core::int _extension#0|foo;
 static method test() → void {
   invalid-expression "pkg/front_end/testcases/extensions/issue44844.dart:11:5: Error: The method 'foo' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart b/pkg/front_end/testcases/extensions/language_issue1182_2.dart
new file mode 100644
index 0000000..c9d46c8
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension Test<T> on T {
+  T Function(T) get test => (a) => this;
+}
+
+class Foo<S extends num> {
+  void test1(S x) {
+    S Function(S) f = x.test;
+  }
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline.expect
new file mode 100644
index 0000000..5f989b2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+extension Test<T> on T {
+  T Function(T) get test => (a) => this;
+}
+
+class Foo<S extends num> {
+  void test1(S x) {}
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9aaf1c7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+class Foo<S extends num> {
+  void test1(S x) {}
+}
+
+extension Test<T> on T {
+  T Function(T) get test => (a) => this;
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.expect
new file mode 100644
index 0000000..aa91968
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(covariant-by-class self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(lowered final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.modular.expect
new file mode 100644
index 0000000..aa91968
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(covariant-by-class self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(lowered final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.outline.expect
new file mode 100644
index 0000000..1431569
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    ;
+  method test1(covariant-by-class self::Foo::S x) → void
+    ;
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(lowered final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..aa91968
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182_2.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(covariant-by-class self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(lowered final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart b/pkg/front_end/testcases/extensions/missing_toplevel.dart
index 2ccfeb9..2844255 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline.expect
index 6a82a61..83182ff 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline_modelled.expect
index 7cede08..94e9a17 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.expect
index 6d6179a..0aedef4 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -12,28 +12,18 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   set setter = self::Extension|set#setter;
 }
-static field self::Class* c = new self::Class::•();
-static field dynamic missingGetter = let final self::Class* #t1 = self::c in let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
+static field self::Class c = new self::Class::•();
+static field dynamic missingGetter = let final self::Class #t1 = self::c in let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/missing_toplevel.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'setter'.
 var missingGetter = c.setter += 42;
-                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic} core::int* in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
-static method Extension|set#setter(lowered final self::Class* #this, core::int* value) → void {}
+                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
+static method Extension|set#setter(lowered final self::Class #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect
index 6d6179a..0aedef4 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -12,28 +12,18 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   set setter = self::Extension|set#setter;
 }
-static field self::Class* c = new self::Class::•();
-static field dynamic missingGetter = let final self::Class* #t1 = self::c in let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
+static field self::Class c = new self::Class::•();
+static field dynamic missingGetter = let final self::Class #t1 = self::c in let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/missing_toplevel.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'setter'.
 var missingGetter = c.setter += 42;
-                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic} core::int* in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
-static method Extension|set#setter(lowered final self::Class* #this, core::int* value) → void {}
+                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
+static method Extension|set#setter(lowered final self::Class #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.outline.expect
index 5cbfe17..543f0d1 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.outline.expect
@@ -1,27 +1,17 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   set setter = self::Extension|set#setter;
 }
-static field self::Class* c;
+static field self::Class c;
 static field dynamic missingGetter;
-static method Extension|set#setter(lowered final self::Class* #this, core::int* value) → void
+static method Extension|set#setter(lowered final self::Class #this, core::int value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.transformed.expect
index 29bae48..ff9cab9 100644
--- a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -12,28 +12,18 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   set setter = self::Extension|set#setter;
 }
-static field self::Class* c = new self::Class::•();
-static field dynamic missingGetter = let final self::Class* #t1 = self::c in let final core::int* #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
+static field self::Class c = new self::Class::•();
+static field dynamic missingGetter = let final self::Class #t1 = self::c in let final core::int #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/extensions/missing_toplevel.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'setter'.
 var missingGetter = c.setter += 42;
-                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic} core::int* in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
-static method Extension|set#setter(lowered final self::Class* #this, core::int* value) → void {}
+                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
+static method Extension|set#setter(lowered final self::Class #this, core::int value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart b/pkg/front_end/testcases/extensions/nested_on_types.dart
index da3d2d7..f0cbdc1 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 class A<T> {}
 
 extension Extension<T> on A<A<T>> {
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline.expect
index fcdf4f1..8970b3e 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A<T> {}
 
 extension Extension<T> on A<A<T>> {
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline_modelled.expect
index fcdf4f1..8970b3e 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A<T> {}
 
 extension Extension<T> on A<A<T>> {
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.expect
index 001a0b6..b453ae6 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::A<self::A<T*>*>* {
+extension Extension<T extends core::Object? = dynamic> on self::A<self::A<T%>> {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
   tearoff method2 = self::Extension|get#method2;
 }
-static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method1::T*>*>* #this) → dynamic {}
-static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T*>*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method Extension|method2<T extends core::Object* = dynamic, A extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method2::T*>*>* #this, self::Extension|method2::A* a) → dynamic {}
-static method Extension|get#method2<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T*>*>* #this) → <A extends core::Object* = dynamic>(A*) →* dynamic
-  return <A extends core::Object* = dynamic>(A* a) → dynamic => self::Extension|method2<self::Extension|get#method2::T*, A*>(#this, a);
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method1::T%>> #this) → dynamic {}
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T%>> #this) → () → dynamic
+  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method Extension|method2<T extends core::Object? = dynamic, A extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method2::T%>> #this, self::Extension|method2::A% a) → dynamic {}
+static method Extension|get#method2<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T%>> #this) → <A extends core::Object? = dynamic>(A%) → dynamic
+  return <A extends core::Object? = dynamic>(A% a) → dynamic => self::Extension|method2<self::Extension|get#method2::T%, A%>(#this, a);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect
index 001a0b6..b453ae6 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::A<self::A<T*>*>* {
+extension Extension<T extends core::Object? = dynamic> on self::A<self::A<T%>> {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
   tearoff method2 = self::Extension|get#method2;
 }
-static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method1::T*>*>* #this) → dynamic {}
-static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T*>*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method Extension|method2<T extends core::Object* = dynamic, A extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method2::T*>*>* #this, self::Extension|method2::A* a) → dynamic {}
-static method Extension|get#method2<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T*>*>* #this) → <A extends core::Object* = dynamic>(A*) →* dynamic
-  return <A extends core::Object* = dynamic>(A* a) → dynamic => self::Extension|method2<self::Extension|get#method2::T*, A*>(#this, a);
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method1::T%>> #this) → dynamic {}
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T%>> #this) → () → dynamic
+  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method Extension|method2<T extends core::Object? = dynamic, A extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method2::T%>> #this, self::Extension|method2::A% a) → dynamic {}
+static method Extension|get#method2<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T%>> #this) → <A extends core::Object? = dynamic>(A%) → dynamic
+  return <A extends core::Object? = dynamic>(A% a) → dynamic => self::Extension|method2<self::Extension|get#method2::T%, A%>(#this, a);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.outline.expect
index b5fda8d..70c836a 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.outline.expect
@@ -1,34 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::A<self::A<T*>*>* {
+extension Extension<T extends core::Object? = dynamic> on self::A<self::A<T%>> {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
   tearoff method2 = self::Extension|get#method2;
 }
-static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method1::T*>*>* #this) → dynamic
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method1::T%>> #this) → dynamic
   ;
-static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T*>*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method Extension|method2<T extends core::Object* = dynamic, A extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method2::T*>*>* #this, self::Extension|method2::A* a) → dynamic
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T%>> #this) → () → dynamic
+  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method Extension|method2<T extends core::Object? = dynamic, A extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method2::T%>> #this, self::Extension|method2::A% a) → dynamic
   ;
-static method Extension|get#method2<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T*>*>* #this) → <A extends core::Object* = dynamic>(A*) →* dynamic
-  return <A extends core::Object* = dynamic>(A* a) → dynamic => self::Extension|method2<self::Extension|get#method2::T*, A*>(#this, a);
+static method Extension|get#method2<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T%>> #this) → <A extends core::Object? = dynamic>(A%) → dynamic
+  return <A extends core::Object? = dynamic>(A% a) → dynamic => self::Extension|method2<self::Extension|get#method2::T%, A%>(#this, a);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.transformed.expect
index 001a0b6..b453ae6 100644
--- a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.transformed.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T*>*
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::Object* = dynamic> on self::A<self::A<T*>*>* {
+extension Extension<T extends core::Object? = dynamic> on self::A<self::A<T%>> {
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
   method method2 = self::Extension|method2;
   tearoff method2 = self::Extension|get#method2;
 }
-static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method1::T*>*>* #this) → dynamic {}
-static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T*>*>* #this) → () →* dynamic
-  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method Extension|method2<T extends core::Object* = dynamic, A extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method2::T*>*>* #this, self::Extension|method2::A* a) → dynamic {}
-static method Extension|get#method2<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T*>*>* #this) → <A extends core::Object* = dynamic>(A*) →* dynamic
-  return <A extends core::Object* = dynamic>(A* a) → dynamic => self::Extension|method2<self::Extension|get#method2::T*, A*>(#this, a);
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method1::T%>> #this) → dynamic {}
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T%>> #this) → () → dynamic
+  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method Extension|method2<T extends core::Object? = dynamic, A extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|method2::T%>> #this, self::Extension|method2::A% a) → dynamic {}
+static method Extension|get#method2<T extends core::Object? = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T%>> #this) → <A extends core::Object? = dynamic>(A%) → dynamic
+  return <A extends core::Object? = dynamic>(A% a) → dynamic => self::Extension|method2<self::Extension|get#method2::T%, A%>(#this, a);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart b/pkg/front_end/testcases/extensions/null_aware.dart
index 327f7b4..ec84183 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart
+++ b/pkg/front_end/testcases/extensions/null_aware.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Class {
   int field;
 }
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.weak.transformed.expect
index b635d6c..f82892b 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.weak.transformed.expect
@@ -88,28 +88,28 @@
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:18:29 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:18:29 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:19:29 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:19:29 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:28:30 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:28:30 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:29:43 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:29:43 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:36:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:36:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:39:30 -> NullConstant(null)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:39:30 -> NullConstant(null)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:40:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:40:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:44:29 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:44:29 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:45:29 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:45:29 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:30 -> NullConstant(null)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:30 -> NullConstant(null)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:55:40 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:55:40 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:20:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:20:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:21:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:21:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:30:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:30:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:31:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:31:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:38:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:38:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:41:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:41:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:42:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:42:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:46:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:46:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:49:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:49:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:57:40 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:57:40 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:58:40 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:58:40 -> IntConstant(87)
 Extra constant evaluation: evaluated: 368, effectively constant: 24
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart b/pkg/front_end/testcases/extensions/null_aware2.dart
new file mode 100644
index 0000000..1fe7d51
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  int? field;
+}
+
+extension Extension on Class {
+  int? get property => field;
+  void set property(int? value) {
+    field = value;
+  }
+
+  int? method() => field;
+
+  testImplicitThis() {
+    expect(null, property);
+    expect(42, property ??= 42);
+    expect(42, property ??= 87);
+  }
+}
+
+main() {
+  test1(null);
+  test2(new Class());
+}
+
+test1(Class? c) {
+  expect(null, c?.property);
+  expect(null, c?.method);
+  expect(null, c?.method());
+  expect(null, c?.property = 42);
+  expect(null, Extension(c)?.property ??= 42);
+}
+
+test2(Class? c) {
+  expect(null, c?.property);
+  expect(null, c?.method());
+  var tearOff = c?.method;
+  expect(null, tearOff!());
+  expect(42, c?.property = 42);
+  expect(42, tearOff());
+
+  expect(null, c?.property = null);
+  expect(42, c?.property = 42);
+
+  c?.property = null;
+  expect(null, c?.property);
+  expect(42, c?.property ??= 42);
+  expect(42, c?.property ??= 87);
+
+  expect(null, c?.property = null);
+  c?.property ??= 42;
+  expect(42, c?.property);
+  c?.property ??= 87;
+  expect(42, c?.property);
+
+  c?.property = null;
+  expect(null, c?.property);
+  expect(42, Extension(c)?.property ??= 42);
+  expect(42, Extension(c)?.property ??= 87);
+
+  c?.property = null;
+  expect(null, c?.property);
+  Extension(c)?.property ??= 42;
+  expect(42, c?.property);
+  Extension(c)?.property ??= 87;
+  expect(42, c?.property);
+
+  c?.property = null;
+  c?.testImplicitThis();
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline.expect
new file mode 100644
index 0000000..7668212
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class Class {
+  int? field;
+}
+
+extension Extension on Class {
+  int? get property => field;
+  void set property(int? value) {}
+  int? method() => field;
+  testImplicitThis() {}
+}
+
+main() {}
+test1(Class? c) {}
+test2(Class? c) {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5e3ddc5
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.textual_outline_modelled.expect
@@ -0,0 +1,16 @@
+class Class {
+  int? field;
+}
+
+expect(expected, actual) {}
+
+extension Extension on Class {
+  int? get property => field;
+  int? method() => field;
+  testImplicitThis() {}
+  void set property(int? value) {}
+}
+
+main() {}
+test1(Class? c) {}
+test2(Class? c) {}
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.weak.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.expect
new file mode 100644
index 0000000..b5e0fa1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method testImplicitThis = self::Extension|testImplicitThis;
+  tearoff testImplicitThis = self::Extension|get#testImplicitThis;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|method(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int?
+  return () → core::int? => self::Extension|method(#this);
+static method Extension|testImplicitThis(lowered final self::Class #this) → dynamic {
+  self::expect(null, self::Extension|get#property(#this));
+  self::expect(42, let final core::int? #t1 = self::Extension|get#property(#this) in #t1 == null ?{core::int} let final core::int #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1{core::int});
+  self::expect(42, let final core::int? #t4 = self::Extension|get#property(#this) in #t4 == null ?{core::int} let final core::int #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4{core::int});
+}
+static method Extension|get#testImplicitThis(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testImplicitThis(#this);
+static method main() → dynamic {
+  self::test1(null);
+  self::test2(new self::Class::•());
+}
+static method test1(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t7 = c in #t7 == null ?{core::int?} null : self::Extension|get#property(#t7{self::Class}));
+  self::expect(null, let final self::Class? #t8 = c in #t8 == null ?{() →? core::int?} null : self::Extension|get#method(#t8{self::Class}));
+  self::expect(null, let final self::Class? #t9 = c in #t9 == null ?{core::int?} null : self::Extension|method(#t9{self::Class}));
+  self::expect(null, let final self::Class? #t10 = c in #t10 == null ?{core::int?} null : let final core::int #t11 = 42 in let final void #t12 = self::Extension|set#property(#t10{self::Class}, #t11) in #t11);
+  self::expect(null, let final self::Class? #t13 = c in #t13 == null ?{core::int?} null : let final core::int? #t14 = self::Extension|get#property(#t13{self::Class}) in #t14 == null ?{core::int} let final core::int #t15 = 42 in let final void #t16 = self::Extension|set#property(#t13{self::Class}, #t15) in #t15 : #t14{core::int});
+}
+static method test2(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t17 = c in #t17 == null ?{core::int?} null : self::Extension|get#property(#t17{self::Class}));
+  self::expect(null, let final self::Class? #t18 = c in #t18 == null ?{core::int?} null : self::Extension|method(#t18{self::Class}));
+  () →? core::int? tearOff = let final self::Class? #t19 = c in #t19 == null ?{() →? core::int?} null : self::Extension|get#method(#t19{self::Class});
+  self::expect(null, tearOff!(){() → core::int?});
+  self::expect(42, let final self::Class? #t20 = c in #t20 == null ?{core::int?} null : let final core::int #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20{self::Class}, #t21) in #t21);
+  self::expect(42, tearOff{() → core::int?}(){() → core::int?});
+  self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
+  self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
+  self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
+  self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32{core::int});
+  self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36{core::int});
+  self::expect(null, let final self::Class? #t39 = c in #t39 == null ?{Null} null : let final has-declared-initializer Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39{self::Class}, #t40) in #t40);
+  let final self::Class? #t42 = c in #t42 == null ?{core::int?} null : self::Extension|get#property(#t42) == null ?{core::int} self::Extension|set#property(#t42, 42) : null;
+  self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
+  let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44) == null ?{core::int} self::Extension|set#property(#t44, 87) : null;
+  self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
+  self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
+  self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
+  self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
+  self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
+  let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int} self::Extension|set#property(#t58{self::Class}, 42) : null;
+  self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
+  let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int} self::Extension|set#property(#t60{self::Class}, 87) : null;
+  self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.modular.expect
new file mode 100644
index 0000000..b5e0fa1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method testImplicitThis = self::Extension|testImplicitThis;
+  tearoff testImplicitThis = self::Extension|get#testImplicitThis;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|method(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int?
+  return () → core::int? => self::Extension|method(#this);
+static method Extension|testImplicitThis(lowered final self::Class #this) → dynamic {
+  self::expect(null, self::Extension|get#property(#this));
+  self::expect(42, let final core::int? #t1 = self::Extension|get#property(#this) in #t1 == null ?{core::int} let final core::int #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1{core::int});
+  self::expect(42, let final core::int? #t4 = self::Extension|get#property(#this) in #t4 == null ?{core::int} let final core::int #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4{core::int});
+}
+static method Extension|get#testImplicitThis(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testImplicitThis(#this);
+static method main() → dynamic {
+  self::test1(null);
+  self::test2(new self::Class::•());
+}
+static method test1(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t7 = c in #t7 == null ?{core::int?} null : self::Extension|get#property(#t7{self::Class}));
+  self::expect(null, let final self::Class? #t8 = c in #t8 == null ?{() →? core::int?} null : self::Extension|get#method(#t8{self::Class}));
+  self::expect(null, let final self::Class? #t9 = c in #t9 == null ?{core::int?} null : self::Extension|method(#t9{self::Class}));
+  self::expect(null, let final self::Class? #t10 = c in #t10 == null ?{core::int?} null : let final core::int #t11 = 42 in let final void #t12 = self::Extension|set#property(#t10{self::Class}, #t11) in #t11);
+  self::expect(null, let final self::Class? #t13 = c in #t13 == null ?{core::int?} null : let final core::int? #t14 = self::Extension|get#property(#t13{self::Class}) in #t14 == null ?{core::int} let final core::int #t15 = 42 in let final void #t16 = self::Extension|set#property(#t13{self::Class}, #t15) in #t15 : #t14{core::int});
+}
+static method test2(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t17 = c in #t17 == null ?{core::int?} null : self::Extension|get#property(#t17{self::Class}));
+  self::expect(null, let final self::Class? #t18 = c in #t18 == null ?{core::int?} null : self::Extension|method(#t18{self::Class}));
+  () →? core::int? tearOff = let final self::Class? #t19 = c in #t19 == null ?{() →? core::int?} null : self::Extension|get#method(#t19{self::Class});
+  self::expect(null, tearOff!(){() → core::int?});
+  self::expect(42, let final self::Class? #t20 = c in #t20 == null ?{core::int?} null : let final core::int #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20{self::Class}, #t21) in #t21);
+  self::expect(42, tearOff{() → core::int?}(){() → core::int?});
+  self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
+  self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
+  self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
+  self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32{core::int});
+  self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36{core::int});
+  self::expect(null, let final self::Class? #t39 = c in #t39 == null ?{Null} null : let final has-declared-initializer Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39{self::Class}, #t40) in #t40);
+  let final self::Class? #t42 = c in #t42 == null ?{core::int?} null : self::Extension|get#property(#t42) == null ?{core::int} self::Extension|set#property(#t42, 42) : null;
+  self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
+  let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44) == null ?{core::int} self::Extension|set#property(#t44, 87) : null;
+  self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
+  self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
+  self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
+  self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
+  self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
+  let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int} self::Extension|set#property(#t58{self::Class}, 42) : null;
+  self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
+  let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int} self::Extension|set#property(#t60{self::Class}, 87) : null;
+  self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.outline.expect
new file mode 100644
index 0000000..235da44
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.outline.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field;
+  synthetic constructor •() → self::Class
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method testImplicitThis = self::Extension|testImplicitThis;
+  tearoff testImplicitThis = self::Extension|get#testImplicitThis;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int?
+  ;
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void
+  ;
+static method Extension|method(lowered final self::Class #this) → core::int?
+  ;
+static method Extension|get#method(lowered final self::Class #this) → () → core::int?
+  return () → core::int? => self::Extension|method(#this);
+static method Extension|testImplicitThis(lowered final self::Class #this) → dynamic
+  ;
+static method Extension|get#testImplicitThis(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testImplicitThis(#this);
+static method main() → dynamic
+  ;
+static method test1(self::Class? c) → dynamic
+  ;
+static method test2(self::Class? c) → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/null_aware2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.transformed.expect
new file mode 100644
index 0000000..a927b20
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware2.dart.weak.transformed.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method testImplicitThis = self::Extension|testImplicitThis;
+  tearoff testImplicitThis = self::Extension|get#testImplicitThis;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|method(lowered final self::Class #this) → core::int?
+  return #this.{self::Class::field}{core::int?};
+static method Extension|get#method(lowered final self::Class #this) → () → core::int?
+  return () → core::int? => self::Extension|method(#this);
+static method Extension|testImplicitThis(lowered final self::Class #this) → dynamic {
+  self::expect(null, self::Extension|get#property(#this));
+  self::expect(42, let final core::int? #t1 = self::Extension|get#property(#this) in #t1 == null ?{core::int} let final core::int #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1{core::int});
+  self::expect(42, let final core::int? #t4 = self::Extension|get#property(#this) in #t4 == null ?{core::int} let final core::int #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4{core::int});
+}
+static method Extension|get#testImplicitThis(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|testImplicitThis(#this);
+static method main() → dynamic {
+  self::test1(null);
+  self::test2(new self::Class::•());
+}
+static method test1(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t7 = c in #t7 == null ?{core::int?} null : self::Extension|get#property(#t7{self::Class}));
+  self::expect(null, let final self::Class? #t8 = c in #t8 == null ?{() →? core::int?} null : self::Extension|get#method(#t8{self::Class}));
+  self::expect(null, let final self::Class? #t9 = c in #t9 == null ?{core::int?} null : self::Extension|method(#t9{self::Class}));
+  self::expect(null, let final self::Class? #t10 = c in #t10 == null ?{core::int?} null : let final core::int #t11 = 42 in let final void #t12 = self::Extension|set#property(#t10{self::Class}, #t11) in #t11);
+  self::expect(null, let final self::Class? #t13 = c in #t13 == null ?{core::int?} null : let final core::int? #t14 = self::Extension|get#property(#t13{self::Class}) in #t14 == null ?{core::int} let final core::int #t15 = 42 in let final void #t16 = self::Extension|set#property(#t13{self::Class}, #t15) in #t15 : #t14{core::int});
+}
+static method test2(self::Class? c) → dynamic {
+  self::expect(null, let final self::Class? #t17 = c in #t17 == null ?{core::int?} null : self::Extension|get#property(#t17{self::Class}));
+  self::expect(null, let final self::Class? #t18 = c in #t18 == null ?{core::int?} null : self::Extension|method(#t18{self::Class}));
+  () →? core::int? tearOff = let final self::Class? #t19 = c in #t19 == null ?{() →? core::int?} null : self::Extension|get#method(#t19{self::Class});
+  self::expect(null, tearOff!(){() → core::int?});
+  self::expect(42, let final self::Class? #t20 = c in #t20 == null ?{core::int?} null : let final core::int #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20{self::Class}, #t21) in #t21);
+  self::expect(42, tearOff{() → core::int?}(){() → core::int?});
+  self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
+  self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
+  self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
+  self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32{core::int});
+  self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36{core::int});
+  self::expect(null, let final self::Class? #t39 = c in #t39 == null ?{Null} null : let final has-declared-initializer Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39{self::Class}, #t40) in #t40);
+  let final self::Class? #t42 = c in #t42 == null ?{core::int?} null : self::Extension|get#property(#t42) == null ?{core::int} self::Extension|set#property(#t42, 42) : null;
+  self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
+  let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44) == null ?{core::int} self::Extension|set#property(#t44, 87) : null;
+  self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
+  self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
+  self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
+  self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
+  self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
+  let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int} self::Extension|set#property(#t58{self::Class}, 42) : null;
+  self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
+  let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int} self::Extension|set#property(#t60{self::Class}, 87) : null;
+  self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:19:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:19:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:20:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:20:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:33:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:33:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:34:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:34:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:42:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:42:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:45:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:45:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:46:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:46:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:50:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:50:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:51:30 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:51:30 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:53:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:53:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:61:41 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:61:41 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:62:41 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware2.dart:62:41 -> IntConstant(87)
+Extra constant evaluation: evaluated: 399, effectively constant: 24
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart b/pkg/front_end/testcases/extensions/on_function_type.dart
index d7f1522..b3e30d2 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension<R, T> on R Function(T) {
   Type get returnType => R;
   Type get parameterType => T;
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline.expect
index ce9147e..7b1f078 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 extension<R, T> on R Function(T) {
   Type get returnType => R;
   Type get parameterType => T;
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline_modelled.expect
index b40bc01..d84ff38 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class<T extends Class<T>> {}
 
 class Subclass extends Class<Subclass> {}
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
index 7fd4a5b..1c1d9b9 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
@@ -1,46 +1,36 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::Class<self::Class::T> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Subclass extends self::Class<self::Subclass*> {
-  synthetic constructor •() → self::Subclass*
+class Subclass extends self::Class<self::Subclass> {
+  synthetic constructor •() → self::Subclass
     : super self::Class::•()
     ;
 }
-extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
+extension _extension#0<R extends core::Object? = dynamic, T extends core::Object? = dynamic> on (T%) → R% {
   get returnType = self::_extension#0|get#returnType;
   get parameterType = self::_extension#0|get#parameterType;
 }
-extension _extension#1<T extends self::Class<T*>* = self::Class<dynamic>*> on <S extends T* = dynamic>(T*, S*) →* dynamic {
+extension _extension#1<T extends self::Class<T> = self::Class<dynamic>> on <S extends T = dynamic>(T, S) → dynamic {
   get parameterType = self::_extension#1|get#parameterType;
 }
-static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
-  return self::_extension#0|get#returnType::R*;
-static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
-  return self::_extension#0|get#parameterType::T*;
-static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = self::Class<dynamic>*>(lowered final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
-  return self::_extension#1|get#parameterType::T*;
+static method _extension#0|get#returnType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#returnType::T%) → self::_extension#0|get#returnType::R% #this) → core::Type
+  return self::_extension#0|get#returnType::R%;
+static method _extension#0|get#parameterType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#parameterType::T%) → self::_extension#0|get#parameterType::R% #this) → core::Type
+  return self::_extension#0|get#parameterType::T%;
+static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T> = self::Class<dynamic>>(lowered final <S extends self::_extension#1|get#parameterType::T = dynamic>(self::_extension#1|get#parameterType::T, S) → dynamic #this) → core::Type
+  return self::_extension#1|get#parameterType::T;
 static method main() → dynamic {
-  function local1(core::int* i) → core::int*
+  function local1(core::int i) → core::int
     return i;
-  core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
-  core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
-  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+  core::print(self::_extension#0|get#returnType<core::int, core::int>(local1));
+  core::print(self::_extension#0|get#parameterType<core::int, core::int>(local1));
+  function local2<S extends self::Subclass>(self::Subclass a, S b) → self::Subclass
     return a;
-  core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
+  core::print(self::_extension#1|get#parameterType<self::Subclass>(local2));
 }
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect
index 7fd4a5b..1c1d9b9 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect
@@ -1,46 +1,36 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::Class<self::Class::T> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Subclass extends self::Class<self::Subclass*> {
-  synthetic constructor •() → self::Subclass*
+class Subclass extends self::Class<self::Subclass> {
+  synthetic constructor •() → self::Subclass
     : super self::Class::•()
     ;
 }
-extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
+extension _extension#0<R extends core::Object? = dynamic, T extends core::Object? = dynamic> on (T%) → R% {
   get returnType = self::_extension#0|get#returnType;
   get parameterType = self::_extension#0|get#parameterType;
 }
-extension _extension#1<T extends self::Class<T*>* = self::Class<dynamic>*> on <S extends T* = dynamic>(T*, S*) →* dynamic {
+extension _extension#1<T extends self::Class<T> = self::Class<dynamic>> on <S extends T = dynamic>(T, S) → dynamic {
   get parameterType = self::_extension#1|get#parameterType;
 }
-static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
-  return self::_extension#0|get#returnType::R*;
-static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
-  return self::_extension#0|get#parameterType::T*;
-static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = self::Class<dynamic>*>(lowered final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
-  return self::_extension#1|get#parameterType::T*;
+static method _extension#0|get#returnType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#returnType::T%) → self::_extension#0|get#returnType::R% #this) → core::Type
+  return self::_extension#0|get#returnType::R%;
+static method _extension#0|get#parameterType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#parameterType::T%) → self::_extension#0|get#parameterType::R% #this) → core::Type
+  return self::_extension#0|get#parameterType::T%;
+static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T> = self::Class<dynamic>>(lowered final <S extends self::_extension#1|get#parameterType::T = dynamic>(self::_extension#1|get#parameterType::T, S) → dynamic #this) → core::Type
+  return self::_extension#1|get#parameterType::T;
 static method main() → dynamic {
-  function local1(core::int* i) → core::int*
+  function local1(core::int i) → core::int
     return i;
-  core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
-  core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
-  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+  core::print(self::_extension#0|get#returnType<core::int, core::int>(local1));
+  core::print(self::_extension#0|get#parameterType<core::int, core::int>(local1));
+  function local2<S extends self::Subclass>(self::Subclass a, S b) → self::Subclass
     return a;
-  core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
+  core::print(self::_extension#1|get#parameterType<self::Subclass>(local2));
 }
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.outline.expect
index 3447999..c49b6a0 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.outline.expect
@@ -1,37 +1,27 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Subclass extends self::Class<self::Subclass*> {
-  synthetic constructor •() → self::Subclass*
+class Class<T extends self::Class<self::Class::T> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     ;
 }
-extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
+class Subclass extends self::Class<self::Subclass> {
+  synthetic constructor •() → self::Subclass
+    ;
+}
+extension _extension#0<R extends core::Object? = dynamic, T extends core::Object? = dynamic> on (T%) → R% {
   get returnType = self::_extension#0|get#returnType;
   get parameterType = self::_extension#0|get#parameterType;
 }
-extension _extension#1<T extends self::Class<T*>* = self::Class<dynamic>*> on <S extends T* = dynamic>(T*, S*) →* dynamic {
+extension _extension#1<T extends self::Class<T> = self::Class<dynamic>> on <S extends T = dynamic>(T, S) → dynamic {
   get parameterType = self::_extension#1|get#parameterType;
 }
-static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
+static method _extension#0|get#returnType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#returnType::T%) → self::_extension#0|get#returnType::R% #this) → core::Type
   ;
-static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
+static method _extension#0|get#parameterType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#parameterType::T%) → self::_extension#0|get#parameterType::R% #this) → core::Type
   ;
-static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = self::Class<dynamic>*>(lowered final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
+static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T> = self::Class<dynamic>>(lowered final <S extends self::_extension#1|get#parameterType::T = dynamic>(self::_extension#1|get#parameterType::T, S) → dynamic #this) → core::Type
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
index 7fd4a5b..1c1d9b9 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
@@ -1,46 +1,36 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
-  synthetic constructor •() → self::Class<self::Class::T*>*
+class Class<T extends self::Class<self::Class::T> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Subclass extends self::Class<self::Subclass*> {
-  synthetic constructor •() → self::Subclass*
+class Subclass extends self::Class<self::Subclass> {
+  synthetic constructor •() → self::Subclass
     : super self::Class::•()
     ;
 }
-extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
+extension _extension#0<R extends core::Object? = dynamic, T extends core::Object? = dynamic> on (T%) → R% {
   get returnType = self::_extension#0|get#returnType;
   get parameterType = self::_extension#0|get#parameterType;
 }
-extension _extension#1<T extends self::Class<T*>* = self::Class<dynamic>*> on <S extends T* = dynamic>(T*, S*) →* dynamic {
+extension _extension#1<T extends self::Class<T> = self::Class<dynamic>> on <S extends T = dynamic>(T, S) → dynamic {
   get parameterType = self::_extension#1|get#parameterType;
 }
-static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
-  return self::_extension#0|get#returnType::R*;
-static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
-  return self::_extension#0|get#parameterType::T*;
-static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = self::Class<dynamic>*>(lowered final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
-  return self::_extension#1|get#parameterType::T*;
+static method _extension#0|get#returnType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#returnType::T%) → self::_extension#0|get#returnType::R% #this) → core::Type
+  return self::_extension#0|get#returnType::R%;
+static method _extension#0|get#parameterType<R extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final (self::_extension#0|get#parameterType::T%) → self::_extension#0|get#parameterType::R% #this) → core::Type
+  return self::_extension#0|get#parameterType::T%;
+static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T> = self::Class<dynamic>>(lowered final <S extends self::_extension#1|get#parameterType::T = dynamic>(self::_extension#1|get#parameterType::T, S) → dynamic #this) → core::Type
+  return self::_extension#1|get#parameterType::T;
 static method main() → dynamic {
-  function local1(core::int* i) → core::int*
+  function local1(core::int i) → core::int
     return i;
-  core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
-  core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
-  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+  core::print(self::_extension#0|get#returnType<core::int, core::int>(local1));
+  core::print(self::_extension#0|get#parameterType<core::int, core::int>(local1));
+  function local2<S extends self::Subclass>(self::Subclass a, S b) → self::Subclass
     return a;
-  core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
+  core::print(self::_extension#1|get#parameterType<self::Subclass>(local2));
 }
diff --git a/pkg/front_end/testcases/extensions/on_type_inference.dart b/pkg/front_end/testcases/extensions/on_type_inference.dart
index d2aaaf8..d81986c 100644
--- a/pkg/front_end/testcases/extensions/on_type_inference.dart
+++ b/pkg/front_end/testcases/extensions/on_type_inference.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 extension BestCom<T extends num> on Iterable<T> {
   T best() => null;
 }
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart b/pkg/front_end/testcases/extensions/on_type_inference2.dart
new file mode 100644
index 0000000..cb372a0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension BestCom<T extends num> on Iterable<T>? {
+  T? best() => null;
+}
+
+extension BestList<T> on List<T> {
+  T? best() => null;
+}
+
+extension BestSpec on List<num> {
+  num? best() => null;
+}
+
+main() {
+  List<int>? x;
+  var v = x.best();
+  List<num>? y;
+  var w = y.best();
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline.expect
new file mode 100644
index 0000000..97b48a4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+extension BestCom<T extends num> on Iterable<T>? {
+  T? best() => null;
+}
+
+extension BestList<T> on List<T> {
+  T? best() => null;
+}
+
+extension BestSpec on List<num> {
+  num? best() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..97b48a4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+extension BestCom<T extends num> on Iterable<T>? {
+  T? best() => null;
+}
+
+extension BestList<T> on List<T> {
+  T? best() => null;
+}
+
+extension BestSpec on List<num> {
+  num? best() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.expect
new file mode 100644
index 0000000..2d94479
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension BestCom<T extends core::num> on core::Iterable<T>? {
+  method best = self::BestCom|best;
+  tearoff best = self::BestCom|get#best;
+}
+extension BestList<T extends core::Object? = dynamic> on core::List<T%> {
+  method best = self::BestList|best;
+  tearoff best = self::BestList|get#best;
+}
+extension BestSpec on core::List<core::num> {
+  method best = self::BestSpec|best;
+  tearoff best = self::BestSpec|get#best;
+}
+static method BestCom|best<T extends core::num>(lowered final core::Iterable<self::BestCom|best::T>? #this) → self::BestCom|best::T?
+  return null;
+static method BestCom|get#best<T extends core::num>(lowered final core::Iterable<self::BestCom|get#best::T>? #this) → () → self::BestCom|get#best::T?
+  return () → self::BestCom|get#best::T? => self::BestCom|best<self::BestCom|get#best::T>(#this);
+static method BestList|best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|best::T%> #this) → self::BestList|best::T?
+  return null;
+static method BestList|get#best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|get#best::T%> #this) → () → self::BestList|get#best::T?
+  return () → self::BestList|get#best::T? => self::BestList|best<self::BestList|get#best::T%>(#this);
+static method BestSpec|best(lowered final core::List<core::num> #this) → core::num?
+  return null;
+static method BestSpec|get#best(lowered final core::List<core::num> #this) → () → core::num?
+  return () → core::num? => self::BestSpec|best(#this);
+static method main() → dynamic {
+  core::List<core::int>? x;
+  core::int? v = self::BestCom|best<core::int>(x);
+  core::List<core::num>? y;
+  core::num? w = self::BestCom|best<core::num>(y);
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.modular.expect
new file mode 100644
index 0000000..2d94479
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension BestCom<T extends core::num> on core::Iterable<T>? {
+  method best = self::BestCom|best;
+  tearoff best = self::BestCom|get#best;
+}
+extension BestList<T extends core::Object? = dynamic> on core::List<T%> {
+  method best = self::BestList|best;
+  tearoff best = self::BestList|get#best;
+}
+extension BestSpec on core::List<core::num> {
+  method best = self::BestSpec|best;
+  tearoff best = self::BestSpec|get#best;
+}
+static method BestCom|best<T extends core::num>(lowered final core::Iterable<self::BestCom|best::T>? #this) → self::BestCom|best::T?
+  return null;
+static method BestCom|get#best<T extends core::num>(lowered final core::Iterable<self::BestCom|get#best::T>? #this) → () → self::BestCom|get#best::T?
+  return () → self::BestCom|get#best::T? => self::BestCom|best<self::BestCom|get#best::T>(#this);
+static method BestList|best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|best::T%> #this) → self::BestList|best::T?
+  return null;
+static method BestList|get#best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|get#best::T%> #this) → () → self::BestList|get#best::T?
+  return () → self::BestList|get#best::T? => self::BestList|best<self::BestList|get#best::T%>(#this);
+static method BestSpec|best(lowered final core::List<core::num> #this) → core::num?
+  return null;
+static method BestSpec|get#best(lowered final core::List<core::num> #this) → () → core::num?
+  return () → core::num? => self::BestSpec|best(#this);
+static method main() → dynamic {
+  core::List<core::int>? x;
+  core::int? v = self::BestCom|best<core::int>(x);
+  core::List<core::num>? y;
+  core::num? w = self::BestCom|best<core::num>(y);
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.outline.expect
new file mode 100644
index 0000000..12f465b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.outline.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension BestCom<T extends core::num> on core::Iterable<T>? {
+  method best = self::BestCom|best;
+  tearoff best = self::BestCom|get#best;
+}
+extension BestList<T extends core::Object? = dynamic> on core::List<T%> {
+  method best = self::BestList|best;
+  tearoff best = self::BestList|get#best;
+}
+extension BestSpec on core::List<core::num> {
+  method best = self::BestSpec|best;
+  tearoff best = self::BestSpec|get#best;
+}
+static method BestCom|best<T extends core::num>(lowered final core::Iterable<self::BestCom|best::T>? #this) → self::BestCom|best::T?
+  ;
+static method BestCom|get#best<T extends core::num>(lowered final core::Iterable<self::BestCom|get#best::T>? #this) → () → self::BestCom|get#best::T?
+  return () → self::BestCom|get#best::T? => self::BestCom|best<self::BestCom|get#best::T>(#this);
+static method BestList|best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|best::T%> #this) → self::BestList|best::T?
+  ;
+static method BestList|get#best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|get#best::T%> #this) → () → self::BestList|get#best::T?
+  return () → self::BestList|get#best::T? => self::BestList|best<self::BestList|get#best::T%>(#this);
+static method BestSpec|best(lowered final core::List<core::num> #this) → core::num?
+  ;
+static method BestSpec|get#best(lowered final core::List<core::num> #this) → () → core::num?
+  return () → core::num? => self::BestSpec|best(#this);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.transformed.expect
new file mode 100644
index 0000000..2d94479
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference2.dart.weak.transformed.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension BestCom<T extends core::num> on core::Iterable<T>? {
+  method best = self::BestCom|best;
+  tearoff best = self::BestCom|get#best;
+}
+extension BestList<T extends core::Object? = dynamic> on core::List<T%> {
+  method best = self::BestList|best;
+  tearoff best = self::BestList|get#best;
+}
+extension BestSpec on core::List<core::num> {
+  method best = self::BestSpec|best;
+  tearoff best = self::BestSpec|get#best;
+}
+static method BestCom|best<T extends core::num>(lowered final core::Iterable<self::BestCom|best::T>? #this) → self::BestCom|best::T?
+  return null;
+static method BestCom|get#best<T extends core::num>(lowered final core::Iterable<self::BestCom|get#best::T>? #this) → () → self::BestCom|get#best::T?
+  return () → self::BestCom|get#best::T? => self::BestCom|best<self::BestCom|get#best::T>(#this);
+static method BestList|best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|best::T%> #this) → self::BestList|best::T?
+  return null;
+static method BestList|get#best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|get#best::T%> #this) → () → self::BestList|get#best::T?
+  return () → self::BestList|get#best::T? => self::BestList|best<self::BestList|get#best::T%>(#this);
+static method BestSpec|best(lowered final core::List<core::num> #this) → core::num?
+  return null;
+static method BestSpec|get#best(lowered final core::List<core::num> #this) → () → core::num?
+  return () → core::num? => self::BestSpec|best(#this);
+static method main() → dynamic {
+  core::List<core::int>? x;
+  core::int? v = self::BestCom|best<core::int>(x);
+  core::List<core::num>? y;
+  core::num? w = self::BestCom|best<core::num>(y);
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart
index 513f153..a4920ec 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Struct {}
 
 class StructA extends Struct {}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
index ea9e928..490ec18 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
@@ -2,37 +2,37 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   nonStruct.method();
 //             ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //                                  ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //             ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   new NonStruct().method();
 //                   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   new NonStruct().property;
 //                   ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   new NonStruct().property = null;
@@ -116,31 +116,31 @@
 }
 static method testNonStruct() → dynamic {
   self::NonStruct* nonStruct;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   nonStruct.method();
             ^^^^^^" in nonStruct{<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   nonStruct.property = nonStruct.property;
-            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   nonStruct.property = nonStruct.property;
                                  ^^^^^^^^" in nonStruct{<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   new NonStruct().method();
                   ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   new NonStruct().property;
                   ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   new NonStruct().property = null;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect
index ea9e928..490ec18 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect
@@ -2,37 +2,37 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   nonStruct.method();
 //             ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //                                  ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //             ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   new NonStruct().method();
 //                   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   new NonStruct().property;
 //                   ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   new NonStruct().property = null;
@@ -116,31 +116,31 @@
 }
 static method testNonStruct() → dynamic {
   self::NonStruct* nonStruct;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   nonStruct.method();
             ^^^^^^" in nonStruct{<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   nonStruct.property = nonStruct.property;
-            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   nonStruct.property = nonStruct.property;
                                  ^^^^^^^^" in nonStruct{<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   new NonStruct().method();
                   ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   new NonStruct().property;
                   ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   new NonStruct().property = null;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
index ea9e928..490ec18 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
@@ -2,37 +2,37 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   nonStruct.method();
 //             ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //                                  ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   nonStruct.property = nonStruct.property;
 //             ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'method'.
 //   new NonStruct().method();
 //                   ^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
 //   new NonStruct().property;
 //                   ^^^^^^^^
 //
-// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
 //  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
 //   new NonStruct().property = null;
@@ -116,31 +116,31 @@
 }
 static method testNonStruct() → dynamic {
   self::NonStruct* nonStruct;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   nonStruct.method();
             ^^^^^^" in nonStruct{<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   nonStruct.property = nonStruct.property;
-            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   nonStruct.property = nonStruct.property;
                                  ^^^^^^^^" in nonStruct{<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'method'.
   new NonStruct().method();
                   ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:49:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
   new NonStruct().property;
                   ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
-  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:50:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
   new NonStruct().property = null;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart
new file mode 100644
index 0000000..b1df269
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Struct {}
+
+class StructA extends Struct {}
+
+class StructB extends Struct {}
+
+class NonStruct {}
+
+extension Extension<T extends Struct?> on T {
+  T method() => this;
+  T get property => this;
+  void set property(T value) {}
+}
+
+main() {
+  Struct? struct;
+  StructA? structA;
+  StructB? structB;
+
+  struct.method();
+  struct.property = struct.property;
+  struct.property = structA.property;
+  struct.property = structB.property;
+  structA.method();
+  structA.property = structA.property;
+  structB.method();
+  structB.property = structB.property;
+
+  new Struct().method();
+  new Struct().property;
+  struct.property = null;
+  new StructA().method();
+  new StructA().property;
+  structA.property = null;
+  new StructB().method();
+  new StructB().property;
+  structB.property = null;
+}
+
+errors() {
+  Struct? struct;
+  StructA? structA;
+  StructB? structB;
+
+  structA.property = struct.property; // error
+  structB.property = struct.property; // error
+
+  new Struct().property = null; // error
+  new StructA().property = null; // error
+  new StructB().property = null; // error
+}
+
+testNonStruct() {
+  NonStruct nonStruct;
+  nonStruct.method(); // error
+  nonStruct.property = nonStruct.property; // error
+  new NonStruct().method(); // error
+  new NonStruct().property; // error
+  new NonStruct().property = null; // error
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline.expect
new file mode 100644
index 0000000..3e1bb00
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+class Struct {}
+
+class StructA extends Struct {}
+
+class StructB extends Struct {}
+
+class NonStruct {}
+
+extension Extension<T extends Struct?> on T {
+  T method() => this;
+  T get property => this;
+  void set property(T value) {}
+}
+
+main() {}
+errors() {}
+testNonStruct() {}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..db89951
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+class NonStruct {}
+
+class Struct {}
+
+class StructA extends Struct {}
+
+class StructB extends Struct {}
+
+errors() {}
+
+extension Extension<T extends Struct?> on T {
+  T get property => this;
+  T method() => this;
+  void set property(T value) {}
+}
+
+main() {}
+testNonStruct() {}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.expect
new file mode 100644
index 0000000..929b404
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.expect
@@ -0,0 +1,202 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structA.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structB.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new Struct().property = null; // error
+//                           ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructA().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructB().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.method(); // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   nonStruct.method(); // error
+//             ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//                        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//                                  ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//             ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   new NonStruct().method(); // error
+//                   ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   new NonStruct().property; // error
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   new NonStruct().property = null; // error
+//                   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Struct extends core::Object {
+  synthetic constructor •() → self::Struct
+    : super core::Object::•()
+    ;
+}
+class StructA extends self::Struct {
+  synthetic constructor •() → self::StructA
+    : super self::Struct::•()
+    ;
+}
+class StructB extends self::Struct {
+  synthetic constructor •() → self::StructB
+    : super self::Struct::•()
+    ;
+}
+class NonStruct extends core::Object {
+  synthetic constructor •() → self::NonStruct
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends self::Struct?> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
+}
+static method Extension|method<T extends self::Struct?>(lowered final self::Extension|method::T% #this) → self::Extension|method::T%
+  return #this;
+static method Extension|get#method<T extends self::Struct?>(lowered final self::Extension|get#method::T% #this) → () → self::Extension|get#method::T%
+  return () → self::Extension|get#method::T% => self::Extension|method<self::Extension|get#method::T%>(#this);
+static method Extension|get#property<T extends self::Struct?>(lowered final self::Extension|get#property::T% #this) → self::Extension|get#property::T%
+  return #this;
+static method Extension|set#property<T extends self::Struct?>(lowered final self::Extension|set#property::T% #this, self::Extension|set#property::T% value) → void {}
+static method main() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|method<self::Struct?>(struct);
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::Struct?>(struct));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::StructA?>(structA);
+  self::Extension|set#property<self::StructA?>(structA, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|method<self::StructB?>(structB);
+  self::Extension|set#property<self::StructB?>(structB, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::Struct>(new self::Struct::•());
+  self::Extension|get#property<self::Struct>(new self::Struct::•());
+  self::Extension|set#property<self::Struct?>(struct, null);
+  self::Extension|method<self::StructA>(new self::StructA::•());
+  self::Extension|get#property<self::StructA>(new self::StructA::•());
+  self::Extension|set#property<self::StructA?>(structA, null);
+  self::Extension|method<self::StructB>(new self::StructB::•());
+  self::Extension|get#property<self::StructB>(new self::StructB::•());
+  self::Extension|set#property<self::StructB?>(structB, null);
+}
+static method errors() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|set#property<self::StructA?>(structA, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structA.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructA?);
+  self::Extension|set#property<self::StructB?>(structB, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structB.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructB?);
+  self::Extension|set#property<self::Struct>(new self::Struct::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new Struct().property = null; // error
+                          ^" in null as{TypeError,ForNonNullableByDefault} self::Struct);
+  self::Extension|set#property<self::StructA>(new self::StructA::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructA().property = null; // error
+                           ^" in null as{TypeError,ForNonNullableByDefault} self::StructA);
+  self::Extension|set#property<self::StructB>(new self::StructB::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructB().property = null; // error
+                           ^" in null as{TypeError,ForNonNullableByDefault} self::StructB);
+}
+static method testNonStruct() → dynamic {
+  self::NonStruct nonStruct;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  nonStruct.method(); // error
+            ^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.method(); // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+            ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+                                 ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+                       ^^^^^^^^^" in nonStruct{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  new NonStruct().method(); // error
+                  ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  new NonStruct().property; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  new NonStruct().property = null; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property = null;
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.modular.expect
new file mode 100644
index 0000000..929b404
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.modular.expect
@@ -0,0 +1,202 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structA.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structB.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new Struct().property = null; // error
+//                           ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructA().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructB().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.method(); // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   nonStruct.method(); // error
+//             ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//                        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//                                  ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//             ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   new NonStruct().method(); // error
+//                   ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   new NonStruct().property; // error
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   new NonStruct().property = null; // error
+//                   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Struct extends core::Object {
+  synthetic constructor •() → self::Struct
+    : super core::Object::•()
+    ;
+}
+class StructA extends self::Struct {
+  synthetic constructor •() → self::StructA
+    : super self::Struct::•()
+    ;
+}
+class StructB extends self::Struct {
+  synthetic constructor •() → self::StructB
+    : super self::Struct::•()
+    ;
+}
+class NonStruct extends core::Object {
+  synthetic constructor •() → self::NonStruct
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends self::Struct?> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
+}
+static method Extension|method<T extends self::Struct?>(lowered final self::Extension|method::T% #this) → self::Extension|method::T%
+  return #this;
+static method Extension|get#method<T extends self::Struct?>(lowered final self::Extension|get#method::T% #this) → () → self::Extension|get#method::T%
+  return () → self::Extension|get#method::T% => self::Extension|method<self::Extension|get#method::T%>(#this);
+static method Extension|get#property<T extends self::Struct?>(lowered final self::Extension|get#property::T% #this) → self::Extension|get#property::T%
+  return #this;
+static method Extension|set#property<T extends self::Struct?>(lowered final self::Extension|set#property::T% #this, self::Extension|set#property::T% value) → void {}
+static method main() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|method<self::Struct?>(struct);
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::Struct?>(struct));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::StructA?>(structA);
+  self::Extension|set#property<self::StructA?>(structA, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|method<self::StructB?>(structB);
+  self::Extension|set#property<self::StructB?>(structB, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::Struct>(new self::Struct::•());
+  self::Extension|get#property<self::Struct>(new self::Struct::•());
+  self::Extension|set#property<self::Struct?>(struct, null);
+  self::Extension|method<self::StructA>(new self::StructA::•());
+  self::Extension|get#property<self::StructA>(new self::StructA::•());
+  self::Extension|set#property<self::StructA?>(structA, null);
+  self::Extension|method<self::StructB>(new self::StructB::•());
+  self::Extension|get#property<self::StructB>(new self::StructB::•());
+  self::Extension|set#property<self::StructB?>(structB, null);
+}
+static method errors() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|set#property<self::StructA?>(structA, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structA.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructA?);
+  self::Extension|set#property<self::StructB?>(structB, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structB.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructB?);
+  self::Extension|set#property<self::Struct>(new self::Struct::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new Struct().property = null; // error
+                          ^" in null as{TypeError,ForNonNullableByDefault} self::Struct);
+  self::Extension|set#property<self::StructA>(new self::StructA::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructA().property = null; // error
+                           ^" in null as{TypeError,ForNonNullableByDefault} self::StructA);
+  self::Extension|set#property<self::StructB>(new self::StructB::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructB().property = null; // error
+                           ^" in null as{TypeError,ForNonNullableByDefault} self::StructB);
+}
+static method testNonStruct() → dynamic {
+  self::NonStruct nonStruct;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  nonStruct.method(); // error
+            ^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.method(); // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+            ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+                                 ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+                       ^^^^^^^^^" in nonStruct{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  new NonStruct().method(); // error
+                  ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  new NonStruct().property; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  new NonStruct().property = null; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property = null;
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.outline.expect
new file mode 100644
index 0000000..ece84fa
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.outline.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Struct extends core::Object {
+  synthetic constructor •() → self::Struct
+    ;
+}
+class StructA extends self::Struct {
+  synthetic constructor •() → self::StructA
+    ;
+}
+class StructB extends self::Struct {
+  synthetic constructor •() → self::StructB
+    ;
+}
+class NonStruct extends core::Object {
+  synthetic constructor •() → self::NonStruct
+    ;
+}
+extension Extension<T extends self::Struct?> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
+}
+static method Extension|method<T extends self::Struct?>(lowered final self::Extension|method::T% #this) → self::Extension|method::T%
+  ;
+static method Extension|get#method<T extends self::Struct?>(lowered final self::Extension|get#method::T% #this) → () → self::Extension|get#method::T%
+  return () → self::Extension|get#method::T% => self::Extension|method<self::Extension|get#method::T%>(#this);
+static method Extension|get#property<T extends self::Struct?>(lowered final self::Extension|get#property::T% #this) → self::Extension|get#property::T%
+  ;
+static method Extension|set#property<T extends self::Struct?>(lowered final self::Extension|set#property::T% #this, self::Extension|set#property::T% value) → void
+  ;
+static method main() → dynamic
+  ;
+static method errors() → dynamic
+  ;
+static method testNonStruct() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.transformed.expect
new file mode 100644
index 0000000..d60080b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference2.dart.weak.transformed.expect
@@ -0,0 +1,202 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structA.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   structB.property = struct.property; // error
+//                             ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+//  - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new Struct().property = null; // error
+//                           ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+//  - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructA().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+//  - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+//   new StructB().property = null; // error
+//                            ^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.method(); // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   nonStruct.method(); // error
+//             ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+//   nonStruct.property = nonStruct.property; // error
+//                        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//                                  ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   nonStruct.property = nonStruct.property; // error
+//             ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   new NonStruct().method(); // error
+//                   ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   new NonStruct().property; // error
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   new NonStruct().property = null; // error
+//                   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Struct extends core::Object {
+  synthetic constructor •() → self::Struct
+    : super core::Object::•()
+    ;
+}
+class StructA extends self::Struct {
+  synthetic constructor •() → self::StructA
+    : super self::Struct::•()
+    ;
+}
+class StructB extends self::Struct {
+  synthetic constructor •() → self::StructB
+    : super self::Struct::•()
+    ;
+}
+class NonStruct extends core::Object {
+  synthetic constructor •() → self::NonStruct
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends self::Struct?> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
+}
+static method Extension|method<T extends self::Struct?>(lowered final self::Extension|method::T% #this) → self::Extension|method::T%
+  return #this;
+static method Extension|get#method<T extends self::Struct?>(lowered final self::Extension|get#method::T% #this) → () → self::Extension|get#method::T%
+  return () → self::Extension|get#method::T% => self::Extension|method<self::Extension|get#method::T%>(#this);
+static method Extension|get#property<T extends self::Struct?>(lowered final self::Extension|get#property::T% #this) → self::Extension|get#property::T%
+  return #this;
+static method Extension|set#property<T extends self::Struct?>(lowered final self::Extension|set#property::T% #this, self::Extension|set#property::T% value) → void {}
+static method main() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|method<self::Struct?>(struct);
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::Struct?>(struct));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|set#property<self::Struct?>(struct, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::StructA?>(structA);
+  self::Extension|set#property<self::StructA?>(structA, self::Extension|get#property<self::StructA?>(structA));
+  self::Extension|method<self::StructB?>(structB);
+  self::Extension|set#property<self::StructB?>(structB, self::Extension|get#property<self::StructB?>(structB));
+  self::Extension|method<self::Struct>(new self::Struct::•());
+  self::Extension|get#property<self::Struct>(new self::Struct::•());
+  self::Extension|set#property<self::Struct?>(struct, null);
+  self::Extension|method<self::StructA>(new self::StructA::•());
+  self::Extension|get#property<self::StructA>(new self::StructA::•());
+  self::Extension|set#property<self::StructA?>(structA, null);
+  self::Extension|method<self::StructB>(new self::StructB::•());
+  self::Extension|get#property<self::StructB>(new self::StructB::•());
+  self::Extension|set#property<self::StructB?>(structB, null);
+}
+static method errors() → dynamic {
+  self::Struct? struct;
+  self::StructA? structA;
+  self::StructB? structB;
+  self::Extension|set#property<self::StructA?>(structA, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:49:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructA?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structA.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructA?);
+  self::Extension|set#property<self::StructB?>(structB, invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:50:29: Error: A value of type 'Struct?' can't be assigned to a variable of type 'StructB?'.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  structB.property = struct.property; // error
+                            ^" in self::Extension|get#property<self::Struct?>(struct) as{TypeError,ForNonNullableByDefault} self::StructB?);
+  self::Extension|set#property<self::Struct>(new self::Struct::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:52:27: Error: The value 'null' can't be assigned to a variable of type 'Struct' because 'Struct' is not nullable.
+ - 'Struct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new Struct().property = null; // error
+                          ^" in null);
+  self::Extension|set#property<self::StructA>(new self::StructA::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:53:28: Error: The value 'null' can't be assigned to a variable of type 'StructA' because 'StructA' is not nullable.
+ - 'StructA' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructA().property = null; // error
+                           ^" in null);
+  self::Extension|set#property<self::StructB>(new self::StructB::•(), invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:54:28: Error: The value 'null' can't be assigned to a variable of type 'StructB' because 'StructB' is not nullable.
+ - 'StructB' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+  new StructB().property = null; // error
+                           ^" in null);
+}
+static method testNonStruct() → dynamic {
+  self::NonStruct nonStruct;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  nonStruct.method(); // error
+            ^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:59:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.method(); // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+            ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:3: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+  ^^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  nonStruct.property = nonStruct.property; // error
+                                 ^^^^^^^^" in invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:60:24: Error: Non-nullable variable 'nonStruct' must be assigned before it can be used.
+  nonStruct.property = nonStruct.property; // error
+                       ^^^^^^^^^" in nonStruct{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:61:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  new NonStruct().method(); // error
+                  ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:62:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  new NonStruct().property; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference2.dart:63:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference2.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  new NonStruct().property = null; // error
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property = null;
+}
diff --git a/pkg/front_end/testcases/extensions/operators.dart b/pkg/front_end/testcases/extensions/operators.dart
index 8e50810..17d5e27 100644
--- a/pkg/front_end/testcases/extensions/operators.dart
+++ b/pkg/front_end/testcases/extensions/operators.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Complex {
   final double real;
   final double imaginary;
diff --git a/pkg/front_end/testcases/extensions/operators.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/operators.dart.textual_outline.expect
index 3242e21..908102a 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Complex {
   final double real;
   final double imaginary;
diff --git a/pkg/front_end/testcases/extensions/operators.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/operators.dart.textual_outline_modelled.expect
index a7a65c6..d77488d 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Complex {
   Complex add(Complex other) {}
   Complex negate() {}
diff --git a/pkg/front_end/testcases/extensions/operators.dart.weak.expect b/pkg/front_end/testcases/extensions/operators.dart.weak.expect
index d97d9f4..7ee87a4 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -14,58 +14,51 @@
 import "dart:core" as core;
 
 class Complex extends core::Object /*hasConstConstructor*/  {
-  final field core::double* real;
-  final field core::double* imaginary;
-  const constructor •(core::double* real, core::double* imaginary) → self::Complex*
+  final field core::double real;
+  final field core::double imaginary;
+  const constructor •(core::double real, core::double imaginary) → self::Complex
     : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
     ;
-  method add(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::+}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::+}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method add(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::+}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::+}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method sub(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::-}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::-}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method sub(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::-}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::-}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method negate() → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::unary-}(){() →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::unary-}(){() →* core::double*});
+  method negate() → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::unary-}(){() → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::unary-}(){() → core::double});
   }
-  get hashCode() → core::int*
-    return this.{self::Complex::real}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(13){(core::num*) →* core::int*}.{core::num::+}(this.{self::Complex::imaginary}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(19){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-  operator ==(core::Object* other) → core::bool* {
+  get hashCode() → core::int
+    return this.{self::Complex::real}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(13){(core::num) → core::int}.{core::num::+}(this.{self::Complex::imaginary}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(19){(core::num) → core::int}){(core::num) → core::int};
+  operator ==(core::Object other) → core::bool {
     if(core::identical(this, other))
       return true;
-    return other is self::Complex* && this.{self::Complex::real}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::real}{core::double*} && this.{self::Complex::imaginary}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::imaginary}{core::double*};
+    return other is{ForNonNullableByDefault} self::Complex && this.{self::Complex::real}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::real}{core::double} && this.{self::Complex::imaginary}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::imaginary}{core::double};
   }
-  method toString() → core::String*
-    return "Complex(${this.{self::Complex::real}{core::double*}},${this.{self::Complex::imaginary}{core::double*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Complex(${this.{self::Complex::real}{core::double}},${this.{self::Complex::imaginary}{core::double}})";
 }
-extension Operators on self::Complex* {
+extension Operators on self::Complex {
   operator + = self::Operators|+;
   operator - = self::Operators|-;
   operator unary- = self::Operators|unary-;
 }
-static method Operators|+(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::add}(other){(self::Complex*) →* self::Complex*};
-static method Operators|-(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::sub}(other){(self::Complex*) →* self::Complex*};
-static method Operators|unary-(lowered final self::Complex* #this) → self::Complex*
-  return #this.{self::Complex::negate}(){() →* self::Complex*};
+static method Operators|+(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::add}(other){(self::Complex) → self::Complex};
+static method Operators|-(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::sub}(other){(self::Complex) → self::Complex};
+static method Operators|unary-(lowered final self::Complex #this) → self::Complex
+  return #this.{self::Complex::negate}(){() → self::Complex};
 static method main() → dynamic {
   self::implicit();
   self::explicit();
 }
 static method implicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -97,11 +90,11 @@
   self::expect(c0, self::Operators|unary-(c0));
 }
 static method explicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -132,16 +125,16 @@
   self::expect(c0, self::Operators|-(c_m2, c_m2));
   self::expect(c0, self::Operators|unary-(c0));
 }
-static method errors(self::Complex* c) → void {
+static method errors(self::Complex c) → void {
   invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) == c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c;
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c;
   !(invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) != c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c);
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect
index d97d9f4..7ee87a4 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -14,58 +14,51 @@
 import "dart:core" as core;
 
 class Complex extends core::Object /*hasConstConstructor*/  {
-  final field core::double* real;
-  final field core::double* imaginary;
-  const constructor •(core::double* real, core::double* imaginary) → self::Complex*
+  final field core::double real;
+  final field core::double imaginary;
+  const constructor •(core::double real, core::double imaginary) → self::Complex
     : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
     ;
-  method add(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::+}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::+}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method add(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::+}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::+}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method sub(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::-}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::-}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method sub(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::-}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::-}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method negate() → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::unary-}(){() →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::unary-}(){() →* core::double*});
+  method negate() → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::unary-}(){() → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::unary-}(){() → core::double});
   }
-  get hashCode() → core::int*
-    return this.{self::Complex::real}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(13){(core::num*) →* core::int*}.{core::num::+}(this.{self::Complex::imaginary}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(19){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-  operator ==(core::Object* other) → core::bool* {
+  get hashCode() → core::int
+    return this.{self::Complex::real}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(13){(core::num) → core::int}.{core::num::+}(this.{self::Complex::imaginary}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(19){(core::num) → core::int}){(core::num) → core::int};
+  operator ==(core::Object other) → core::bool {
     if(core::identical(this, other))
       return true;
-    return other is self::Complex* && this.{self::Complex::real}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::real}{core::double*} && this.{self::Complex::imaginary}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::imaginary}{core::double*};
+    return other is{ForNonNullableByDefault} self::Complex && this.{self::Complex::real}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::real}{core::double} && this.{self::Complex::imaginary}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::imaginary}{core::double};
   }
-  method toString() → core::String*
-    return "Complex(${this.{self::Complex::real}{core::double*}},${this.{self::Complex::imaginary}{core::double*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Complex(${this.{self::Complex::real}{core::double}},${this.{self::Complex::imaginary}{core::double}})";
 }
-extension Operators on self::Complex* {
+extension Operators on self::Complex {
   operator + = self::Operators|+;
   operator - = self::Operators|-;
   operator unary- = self::Operators|unary-;
 }
-static method Operators|+(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::add}(other){(self::Complex*) →* self::Complex*};
-static method Operators|-(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::sub}(other){(self::Complex*) →* self::Complex*};
-static method Operators|unary-(lowered final self::Complex* #this) → self::Complex*
-  return #this.{self::Complex::negate}(){() →* self::Complex*};
+static method Operators|+(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::add}(other){(self::Complex) → self::Complex};
+static method Operators|-(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::sub}(other){(self::Complex) → self::Complex};
+static method Operators|unary-(lowered final self::Complex #this) → self::Complex
+  return #this.{self::Complex::negate}(){() → self::Complex};
 static method main() → dynamic {
   self::implicit();
   self::explicit();
 }
 static method implicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -97,11 +90,11 @@
   self::expect(c0, self::Operators|unary-(c0));
 }
 static method explicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -132,16 +125,16 @@
   self::expect(c0, self::Operators|-(c_m2, c_m2));
   self::expect(c0, self::Operators|unary-(c0));
 }
-static method errors(self::Complex* c) → void {
+static method errors(self::Complex c) → void {
   invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) == c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c;
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c;
   !(invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) != c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c);
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/operators.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/operators.dart.weak.outline.expect
index 479c1d6..75596b2 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.weak.outline.expect
@@ -1,43 +1,36 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Complex extends core::Object /*hasConstConstructor*/  {
-  final field core::double* real;
-  final field core::double* imaginary;
-  const constructor •(core::double* real, core::double* imaginary) → self::Complex*
+  final field core::double real;
+  final field core::double imaginary;
+  const constructor •(core::double real, core::double imaginary) → self::Complex
     : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
     ;
-  method add(self::Complex* other) → self::Complex*
+  method add(self::Complex other) → self::Complex
     ;
-  method sub(self::Complex* other) → self::Complex*
+  method sub(self::Complex other) → self::Complex
     ;
-  method negate() → self::Complex*
+  method negate() → self::Complex
     ;
-  get hashCode() → core::int*
+  get hashCode() → core::int
     ;
-  operator ==(core::Object* other) → core::bool*
+  operator ==(core::Object other) → core::bool
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Operators on self::Complex* {
+extension Operators on self::Complex {
   operator + = self::Operators|+;
   operator - = self::Operators|-;
   operator unary- = self::Operators|unary-;
 }
-static method Operators|+(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
+static method Operators|+(lowered final self::Complex #this, self::Complex other) → self::Complex
   ;
-static method Operators|-(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
+static method Operators|-(lowered final self::Complex #this, self::Complex other) → self::Complex
   ;
-static method Operators|unary-(lowered final self::Complex* #this) → self::Complex*
+static method Operators|unary-(lowered final self::Complex #this) → self::Complex
   ;
 static method main() → dynamic
   ;
@@ -45,7 +38,7 @@
   ;
 static method explicit() → dynamic
   ;
-static method errors(self::Complex* c) → void
+static method errors(self::Complex c) → void
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/operators.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/operators.dart.weak.transformed.expect
index d97d9f4..7ee87a4 100644
--- a/pkg/front_end/testcases/extensions/operators.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/operators.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -14,58 +14,51 @@
 import "dart:core" as core;
 
 class Complex extends core::Object /*hasConstConstructor*/  {
-  final field core::double* real;
-  final field core::double* imaginary;
-  const constructor •(core::double* real, core::double* imaginary) → self::Complex*
+  final field core::double real;
+  final field core::double imaginary;
+  const constructor •(core::double real, core::double imaginary) → self::Complex
     : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
     ;
-  method add(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::+}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::+}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method add(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::+}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::+}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method sub(self::Complex* other) → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::-}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::-}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  method sub(self::Complex other) → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::-}(other.{self::Complex::real}{core::double}){(core::num) → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::-}(other.{self::Complex::imaginary}{core::double}){(core::num) → core::double});
   }
-  method negate() → self::Complex* {
-    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::unary-}(){() →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::unary-}(){() →* core::double*});
+  method negate() → self::Complex {
+    return new self::Complex::•(this.{self::Complex::real}{core::double}.{core::double::unary-}(){() → core::double}, this.{self::Complex::imaginary}{core::double}.{core::double::unary-}(){() → core::double});
   }
-  get hashCode() → core::int*
-    return this.{self::Complex::real}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(13){(core::num*) →* core::int*}.{core::num::+}(this.{self::Complex::imaginary}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(19){(core::num*) →* core::int*}){(core::num*) →* core::int*};
-  operator ==(core::Object* other) → core::bool* {
+  get hashCode() → core::int
+    return this.{self::Complex::real}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(13){(core::num) → core::int}.{core::num::+}(this.{self::Complex::imaginary}{core::double}.{core::num::hashCode}{core::int}.{core::num::*}(19){(core::num) → core::int}){(core::num) → core::int};
+  operator ==(core::Object other) → core::bool {
     if(core::identical(this, other))
       return true;
-    return other is self::Complex* && this.{self::Complex::real}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::real}{core::double*} && this.{self::Complex::imaginary}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::imaginary}{core::double*};
+    return other is{ForNonNullableByDefault} self::Complex && this.{self::Complex::real}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::real}{core::double} && this.{self::Complex::imaginary}{core::double} =={core::num::==}{(core::Object) → core::bool} other{self::Complex}.{self::Complex::imaginary}{core::double};
   }
-  method toString() → core::String*
-    return "Complex(${this.{self::Complex::real}{core::double*}},${this.{self::Complex::imaginary}{core::double*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Complex(${this.{self::Complex::real}{core::double}},${this.{self::Complex::imaginary}{core::double}})";
 }
-extension Operators on self::Complex* {
+extension Operators on self::Complex {
   operator + = self::Operators|+;
   operator - = self::Operators|-;
   operator unary- = self::Operators|unary-;
 }
-static method Operators|+(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::add}(other){(self::Complex*) →* self::Complex*};
-static method Operators|-(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
-  return #this.{self::Complex::sub}(other){(self::Complex*) →* self::Complex*};
-static method Operators|unary-(lowered final self::Complex* #this) → self::Complex*
-  return #this.{self::Complex::negate}(){() →* self::Complex*};
+static method Operators|+(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::add}(other){(self::Complex) → self::Complex};
+static method Operators|-(lowered final self::Complex #this, self::Complex other) → self::Complex
+  return #this.{self::Complex::sub}(other){(self::Complex) → self::Complex};
+static method Operators|unary-(lowered final self::Complex #this) → self::Complex
+  return #this.{self::Complex::negate}(){() → self::Complex};
 static method main() → dynamic {
   self::implicit();
   self::explicit();
 }
 static method implicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -97,11 +90,11 @@
   self::expect(c0, self::Operators|unary-(c0));
 }
 static method explicit() → dynamic {
-  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
-  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
-  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
-  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
-  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::Complex c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex c2 = new self::Complex::•(2.0, -2.0);
   self::expect(c_m2, self::Operators|+(c0, c_m2));
   self::expect(c_m2, self::Operators|+(c_m2, c0));
   self::expect(c_m2, self::Operators|+(c_m1, c_m1));
@@ -132,16 +125,16 @@
   self::expect(c0, self::Operators|-(c_m2, c_m2));
   self::expect(c0, self::Operators|unary-(c0));
 }
-static method errors(self::Complex* c) → void {
+static method errors(self::Complex c) → void {
   invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) == c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c;
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c;
   !(invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
   Operators(c) != c;
-  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c);
+  ^^^^^^^^^" =={core::Object::==}{(core::Object) → core::bool} c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart b/pkg/front_end/testcases/extensions/other_kinds.dart
index cefe49f..91046a3 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart
@@ -1,9 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A1 {
-  int _instanceField;
+  int _instanceField = 0;
   int getInstanceField() => _instanceField;
   void setInstanceField(int value) {
     _instanceField = value;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline.expect
index 70739a0..b57e67b 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline.expect
@@ -1,6 +1,5 @@
-// @dart = 2.9
 class A1 {
-  int _instanceField;
+  int _instanceField = 0;
   int getInstanceField() => _instanceField;
   void setInstanceField(int value) {}
   static int _staticField = 0;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline_modelled.expect
index ceb2b26..1691357 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.textual_outline_modelled.expect
@@ -1,6 +1,5 @@
-// @dart = 2.9
 class A1 {
-  int _instanceField;
+  int _instanceField = 0;
   int getInstanceField() => _instanceField;
   static int _staticField = 0;
   static int getStaticField() => _staticField;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.expect
index 5a567f7..267a00e 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.expect
@@ -1,35 +1,25 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::int* _instanceField = null;
-  static field core::int* _staticField = 0;
-  synthetic constructor •() → self::A1*
+  field core::int _instanceField = 0;
+  static field core::int _staticField = 0;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  method getInstanceField() → core::int*
-    return this.{self::A1::_instanceField}{core::int*};
-  method setInstanceField(core::int* value) → void {
+  method getInstanceField() → core::int
+    return this.{self::A1::_instanceField}{core::int};
+  method setInstanceField(core::int value) → void {
     this.{self::A1::_instanceField} = value;
   }
-  static method getStaticField() → core::int*
+  static method getStaticField() → core::int
     return self::A1::_staticField;
-  static method setStaticField(core::int* value) → void {
+  static method setStaticField(core::int value) → void {
     self::A1::_staticField = value;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   get instanceProperty = self::A2|get#instanceProperty;
   operator + = self::A2|+;
   operator - = self::A2|-;
@@ -39,24 +29,24 @@
   set instanceProperty = self::A2|set#instanceProperty;
   static set staticProperty = set self::A2|staticProperty;
 }
-static field core::int* A2|staticField = self::A1::getStaticField();
-static method A2|get#instanceProperty(lowered final self::A1* #this) → core::int*
-  return #this.{self::A1::getInstanceField}(){() →* core::int*};
-static method A2|set#instanceProperty(lowered final self::A1* #this, core::int* value) → void {
-  #this.{self::A1::setInstanceField}(value){(core::int*) →* void};
+static field core::int A2|staticField = self::A1::getStaticField();
+static method A2|get#instanceProperty(lowered final self::A1 #this) → core::int
+  return #this.{self::A1::getInstanceField}(){() → core::int};
+static method A2|set#instanceProperty(lowered final self::A1 #this, core::int value) → void {
+  #this.{self::A1::setInstanceField}(value){(core::int) → void};
 }
-static method A2|+(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::+}(value){(core::num*) →* core::int*};
+static method A2|+(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::+}(value){(core::num) → core::int};
 }
-static method A2|-(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::-}(value){(core::num*) →* core::int*};
+static method A2|-(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::-}(value){(core::num) → core::int};
 }
-static method A2|unary-(lowered final self::A1* #this) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::int::unary-}(){() →* core::int*};
+static method A2|unary-(lowered final self::A1 #this) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::int::unary-}(){() → core::int};
 }
-static get A2|staticProperty() → core::int*
+static get A2|staticProperty() → core::int
   return self::A1::getStaticField();
-static set A2|staticProperty(core::int* value) → void {
+static set A2|staticProperty(core::int value) → void {
   self::A1::setStaticField(value);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect
index 5a567f7..267a00e 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect
@@ -1,35 +1,25 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::int* _instanceField = null;
-  static field core::int* _staticField = 0;
-  synthetic constructor •() → self::A1*
+  field core::int _instanceField = 0;
+  static field core::int _staticField = 0;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  method getInstanceField() → core::int*
-    return this.{self::A1::_instanceField}{core::int*};
-  method setInstanceField(core::int* value) → void {
+  method getInstanceField() → core::int
+    return this.{self::A1::_instanceField}{core::int};
+  method setInstanceField(core::int value) → void {
     this.{self::A1::_instanceField} = value;
   }
-  static method getStaticField() → core::int*
+  static method getStaticField() → core::int
     return self::A1::_staticField;
-  static method setStaticField(core::int* value) → void {
+  static method setStaticField(core::int value) → void {
     self::A1::_staticField = value;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   get instanceProperty = self::A2|get#instanceProperty;
   operator + = self::A2|+;
   operator - = self::A2|-;
@@ -39,24 +29,24 @@
   set instanceProperty = self::A2|set#instanceProperty;
   static set staticProperty = set self::A2|staticProperty;
 }
-static field core::int* A2|staticField = self::A1::getStaticField();
-static method A2|get#instanceProperty(lowered final self::A1* #this) → core::int*
-  return #this.{self::A1::getInstanceField}(){() →* core::int*};
-static method A2|set#instanceProperty(lowered final self::A1* #this, core::int* value) → void {
-  #this.{self::A1::setInstanceField}(value){(core::int*) →* void};
+static field core::int A2|staticField = self::A1::getStaticField();
+static method A2|get#instanceProperty(lowered final self::A1 #this) → core::int
+  return #this.{self::A1::getInstanceField}(){() → core::int};
+static method A2|set#instanceProperty(lowered final self::A1 #this, core::int value) → void {
+  #this.{self::A1::setInstanceField}(value){(core::int) → void};
 }
-static method A2|+(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::+}(value){(core::num*) →* core::int*};
+static method A2|+(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::+}(value){(core::num) → core::int};
 }
-static method A2|-(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::-}(value){(core::num*) →* core::int*};
+static method A2|-(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::-}(value){(core::num) → core::int};
 }
-static method A2|unary-(lowered final self::A1* #this) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::int::unary-}(){() →* core::int*};
+static method A2|unary-(lowered final self::A1 #this) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::int::unary-}(){() → core::int};
 }
-static get A2|staticProperty() → core::int*
+static get A2|staticProperty() → core::int
   return self::A1::getStaticField();
-static set A2|staticProperty(core::int* value) → void {
+static set A2|staticProperty(core::int value) → void {
   self::A1::setStaticField(value);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.outline.expect
index e2dcbf5..8a9fd95 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.outline.expect
@@ -1,32 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::int* _instanceField;
-  static field core::int* _staticField;
-  synthetic constructor •() → self::A1*
+  field core::int _instanceField;
+  static field core::int _staticField;
+  synthetic constructor •() → self::A1
     ;
-  method getInstanceField() → core::int*
+  method getInstanceField() → core::int
     ;
-  method setInstanceField(core::int* value) → void
+  method setInstanceField(core::int value) → void
     ;
-  static method getStaticField() → core::int*
+  static method getStaticField() → core::int
     ;
-  static method setStaticField(core::int* value) → void
+  static method setStaticField(core::int value) → void
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   get instanceProperty = self::A2|get#instanceProperty;
   operator + = self::A2|+;
   operator - = self::A2|-;
@@ -36,20 +26,20 @@
   set instanceProperty = self::A2|set#instanceProperty;
   static set staticProperty = set self::A2|staticProperty;
 }
-static field core::int* A2|staticField;
-static method A2|get#instanceProperty(lowered final self::A1* #this) → core::int*
+static field core::int A2|staticField;
+static method A2|get#instanceProperty(lowered final self::A1 #this) → core::int
   ;
-static method A2|set#instanceProperty(lowered final self::A1* #this, core::int* value) → void
+static method A2|set#instanceProperty(lowered final self::A1 #this, core::int value) → void
   ;
-static method A2|+(lowered final self::A1* #this, core::int* value) → core::int*
+static method A2|+(lowered final self::A1 #this, core::int value) → core::int
   ;
-static method A2|-(lowered final self::A1* #this, core::int* value) → core::int*
+static method A2|-(lowered final self::A1 #this, core::int value) → core::int
   ;
-static method A2|unary-(lowered final self::A1* #this) → core::int*
+static method A2|unary-(lowered final self::A1 #this) → core::int
   ;
-static get A2|staticProperty() → core::int*
+static get A2|staticProperty() → core::int
   ;
-static set A2|staticProperty(core::int* value) → void
+static set A2|staticProperty(core::int value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.transformed.expect
index 5a567f7..267a00e 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.transformed.expect
@@ -1,35 +1,25 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  field core::int* _instanceField = null;
-  static field core::int* _staticField = 0;
-  synthetic constructor •() → self::A1*
+  field core::int _instanceField = 0;
+  static field core::int _staticField = 0;
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  method getInstanceField() → core::int*
-    return this.{self::A1::_instanceField}{core::int*};
-  method setInstanceField(core::int* value) → void {
+  method getInstanceField() → core::int
+    return this.{self::A1::_instanceField}{core::int};
+  method setInstanceField(core::int value) → void {
     this.{self::A1::_instanceField} = value;
   }
-  static method getStaticField() → core::int*
+  static method getStaticField() → core::int
     return self::A1::_staticField;
-  static method setStaticField(core::int* value) → void {
+  static method setStaticField(core::int value) → void {
     self::A1::_staticField = value;
   }
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   get instanceProperty = self::A2|get#instanceProperty;
   operator + = self::A2|+;
   operator - = self::A2|-;
@@ -39,24 +29,24 @@
   set instanceProperty = self::A2|set#instanceProperty;
   static set staticProperty = set self::A2|staticProperty;
 }
-static field core::int* A2|staticField = self::A1::getStaticField();
-static method A2|get#instanceProperty(lowered final self::A1* #this) → core::int*
-  return #this.{self::A1::getInstanceField}(){() →* core::int*};
-static method A2|set#instanceProperty(lowered final self::A1* #this, core::int* value) → void {
-  #this.{self::A1::setInstanceField}(value){(core::int*) →* void};
+static field core::int A2|staticField = self::A1::getStaticField();
+static method A2|get#instanceProperty(lowered final self::A1 #this) → core::int
+  return #this.{self::A1::getInstanceField}(){() → core::int};
+static method A2|set#instanceProperty(lowered final self::A1 #this, core::int value) → void {
+  #this.{self::A1::setInstanceField}(value){(core::int) → void};
 }
-static method A2|+(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::+}(value){(core::num*) →* core::int*};
+static method A2|+(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::+}(value){(core::num) → core::int};
 }
-static method A2|-(lowered final self::A1* #this, core::int* value) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::-}(value){(core::num*) →* core::int*};
+static method A2|-(lowered final self::A1 #this, core::int value) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::num::-}(value){(core::num) → core::int};
 }
-static method A2|unary-(lowered final self::A1* #this) → core::int* {
-  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::int::unary-}(){() →* core::int*};
+static method A2|unary-(lowered final self::A1 #this) → core::int {
+  return #this.{self::A1::getInstanceField}(){() → core::int}.{core::int::unary-}(){() → core::int};
 }
-static get A2|staticProperty() → core::int*
+static get A2|staticProperty() → core::int
   return self::A1::getStaticField();
-static set A2|staticProperty(core::int* value) → void {
+static set A2|staticProperty(core::int value) → void {
   self::A1::setStaticField(value);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/private_members.dart b/pkg/front_end/testcases/extensions/private_members.dart
index 73cbe03..59b873f 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart
+++ b/pkg/front_end/testcases/extensions/private_members.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 import 'private_members_lib.dart';
 
 main() {
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/private_members.dart.textual_outline.expect
index 492a3a9..ca40cab 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'private_members_lib.dart';
 
 main() {}
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/private_members.dart.textual_outline_modelled.expect
index 65259cc..dfeb024 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 import 'private_members_lib.dart';
 
 errors() {}
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.weak.expect b/pkg/front_end/testcases/extensions/private_members.dart.weak.expect
index 1e4a440..b67ccfa 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -103,11 +103,11 @@
                               ^^^^^^^^^^^^^^^^^^^^^");
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as pri;
 import "dart:core" as core;
 
-extension _PrivateExtension on core::String* {
+extension _PrivateExtension on core::String {
   method publicMethod1 = pri::_PrivateExtension|publicMethod1;
   tearoff publicMethod1 = pri::_PrivateExtension|get#publicMethod1;
   method _privateMethod1 = pri::_PrivateExtension|_privateMethod1;
@@ -117,7 +117,7 @@
   method test1 = pri::_PrivateExtension|test1;
   tearoff test1 = pri::_PrivateExtension|get#test1;
 }
-extension PublicExtension on core::String* {
+extension PublicExtension on core::String {
   method publicMethod2 = pri::PublicExtension|publicMethod2;
   tearoff publicMethod2 = pri::PublicExtension|get#publicMethod2;
   method _privateMethod2 = pri::PublicExtension|_privateMethod2;
@@ -127,7 +127,7 @@
   method test2 = pri::PublicExtension|test2;
   tearoff test2 = pri::PublicExtension|get#test2;
 }
-extension _extension#0 on core::String* {
+extension _extension#0 on core::String {
   method publicMethod3 = pri::_extension#0|publicMethod3;
   tearoff publicMethod3 = pri::_extension#0|get#publicMethod3;
   method _privateMethod3 = pri::_extension#0|_privateMethod3;
@@ -137,65 +137,65 @@
   method test3 = pri::_extension#0|test3;
   tearoff test3 = pri::_extension#0|get#test3;
 }
-static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|publicMethod1(lowered final core::String #this) → core::int
   return 42;
-static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|publicMethod1(#this);
-static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|get#publicMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|publicMethod1(#this);
+static method _PrivateExtension|_privateMethod1(lowered final core::String #this) → core::int
   return 87;
-static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|_privateMethod1(#this);
-static method _PrivateExtension|publicStaticMethod1() → core::int*
+static method _PrivateExtension|get#_privateMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|_privateMethod1(#this);
+static method _PrivateExtension|publicStaticMethod1() → core::int
   return 24;
-static method _PrivateExtension|_privateStaticMethod1() → core::int*
+static method _PrivateExtension|_privateStaticMethod1() → core::int
   return 78;
-static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic {
+static method _PrivateExtension|test1(lowered final core::String #this) → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(#this));
   pri::expect(87, pri::_PrivateExtension|_privateMethod1(#this));
   pri::expect(24, pri::_PrivateExtension|publicStaticMethod1());
   pri::expect(78, pri::_PrivateExtension|_privateStaticMethod1());
 }
-static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
+static method _PrivateExtension|get#test1(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_PrivateExtension|test1(#this);
-static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|publicMethod2(lowered final core::String #this) → core::int
   return 123;
-static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|publicMethod2(#this);
-static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|get#publicMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|publicMethod2(#this);
+static method PublicExtension|_privateMethod2(lowered final core::String #this) → core::int
   return 237;
-static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|_privateMethod2(#this);
-static method PublicExtension|publicStaticMethod2() → core::int*
+static method PublicExtension|get#_privateMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|_privateMethod2(#this);
+static method PublicExtension|publicStaticMethod2() → core::int
   return 321;
-static method PublicExtension|_privateStaticMethod2() → core::int*
+static method PublicExtension|_privateStaticMethod2() → core::int
   return 732;
-static method PublicExtension|test2(lowered final core::String* #this) → dynamic {
+static method PublicExtension|test2(lowered final core::String #this) → dynamic {
   pri::expect(123, pri::PublicExtension|publicMethod2(#this));
   pri::expect(237, pri::PublicExtension|_privateMethod2(#this));
   pri::expect(321, pri::PublicExtension|publicStaticMethod2());
   pri::expect(732, pri::PublicExtension|_privateStaticMethod2());
 }
-static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
+static method PublicExtension|get#test2(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::PublicExtension|test2(#this);
-static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|publicMethod3(lowered final core::String #this) → core::int
   return 473;
-static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|publicMethod3(#this);
-static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|get#publicMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|publicMethod3(#this);
+static method _extension#0|_privateMethod3(lowered final core::String #this) → core::int
   return 586;
-static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|_privateMethod3(#this);
-static method _extension#0|publicStaticMethod3() → core::int*
+static method _extension#0|get#_privateMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|_privateMethod3(#this);
+static method _extension#0|publicStaticMethod3() → core::int
   return 374;
-static method _extension#0|_privateStaticMethod3() → core::int*
+static method _extension#0|_privateStaticMethod3() → core::int
   return 685;
-static method _extension#0|test3(lowered final core::String* #this) → dynamic {
+static method _extension#0|test3(lowered final core::String #this) → dynamic {
   pri::expect(473, pri::_extension#0|publicMethod3(#this));
   pri::expect(586, pri::_extension#0|_privateMethod3(#this));
   pri::expect(374, pri::_extension#0|publicStaticMethod3());
   pri::expect(685, pri::_extension#0|_privateStaticMethod3());
 }
-static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
+static method _extension#0|get#test3(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_extension#0|test3(#this);
 static method test() → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(""));
@@ -217,7 +217,7 @@
   pri::_extension#0|test3("");
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect
index 1e4a440..b67ccfa 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -103,11 +103,11 @@
                               ^^^^^^^^^^^^^^^^^^^^^");
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as pri;
 import "dart:core" as core;
 
-extension _PrivateExtension on core::String* {
+extension _PrivateExtension on core::String {
   method publicMethod1 = pri::_PrivateExtension|publicMethod1;
   tearoff publicMethod1 = pri::_PrivateExtension|get#publicMethod1;
   method _privateMethod1 = pri::_PrivateExtension|_privateMethod1;
@@ -117,7 +117,7 @@
   method test1 = pri::_PrivateExtension|test1;
   tearoff test1 = pri::_PrivateExtension|get#test1;
 }
-extension PublicExtension on core::String* {
+extension PublicExtension on core::String {
   method publicMethod2 = pri::PublicExtension|publicMethod2;
   tearoff publicMethod2 = pri::PublicExtension|get#publicMethod2;
   method _privateMethod2 = pri::PublicExtension|_privateMethod2;
@@ -127,7 +127,7 @@
   method test2 = pri::PublicExtension|test2;
   tearoff test2 = pri::PublicExtension|get#test2;
 }
-extension _extension#0 on core::String* {
+extension _extension#0 on core::String {
   method publicMethod3 = pri::_extension#0|publicMethod3;
   tearoff publicMethod3 = pri::_extension#0|get#publicMethod3;
   method _privateMethod3 = pri::_extension#0|_privateMethod3;
@@ -137,65 +137,65 @@
   method test3 = pri::_extension#0|test3;
   tearoff test3 = pri::_extension#0|get#test3;
 }
-static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|publicMethod1(lowered final core::String #this) → core::int
   return 42;
-static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|publicMethod1(#this);
-static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|get#publicMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|publicMethod1(#this);
+static method _PrivateExtension|_privateMethod1(lowered final core::String #this) → core::int
   return 87;
-static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|_privateMethod1(#this);
-static method _PrivateExtension|publicStaticMethod1() → core::int*
+static method _PrivateExtension|get#_privateMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|_privateMethod1(#this);
+static method _PrivateExtension|publicStaticMethod1() → core::int
   return 24;
-static method _PrivateExtension|_privateStaticMethod1() → core::int*
+static method _PrivateExtension|_privateStaticMethod1() → core::int
   return 78;
-static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic {
+static method _PrivateExtension|test1(lowered final core::String #this) → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(#this));
   pri::expect(87, pri::_PrivateExtension|_privateMethod1(#this));
   pri::expect(24, pri::_PrivateExtension|publicStaticMethod1());
   pri::expect(78, pri::_PrivateExtension|_privateStaticMethod1());
 }
-static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
+static method _PrivateExtension|get#test1(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_PrivateExtension|test1(#this);
-static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|publicMethod2(lowered final core::String #this) → core::int
   return 123;
-static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|publicMethod2(#this);
-static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|get#publicMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|publicMethod2(#this);
+static method PublicExtension|_privateMethod2(lowered final core::String #this) → core::int
   return 237;
-static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|_privateMethod2(#this);
-static method PublicExtension|publicStaticMethod2() → core::int*
+static method PublicExtension|get#_privateMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|_privateMethod2(#this);
+static method PublicExtension|publicStaticMethod2() → core::int
   return 321;
-static method PublicExtension|_privateStaticMethod2() → core::int*
+static method PublicExtension|_privateStaticMethod2() → core::int
   return 732;
-static method PublicExtension|test2(lowered final core::String* #this) → dynamic {
+static method PublicExtension|test2(lowered final core::String #this) → dynamic {
   pri::expect(123, pri::PublicExtension|publicMethod2(#this));
   pri::expect(237, pri::PublicExtension|_privateMethod2(#this));
   pri::expect(321, pri::PublicExtension|publicStaticMethod2());
   pri::expect(732, pri::PublicExtension|_privateStaticMethod2());
 }
-static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
+static method PublicExtension|get#test2(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::PublicExtension|test2(#this);
-static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|publicMethod3(lowered final core::String #this) → core::int
   return 473;
-static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|publicMethod3(#this);
-static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|get#publicMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|publicMethod3(#this);
+static method _extension#0|_privateMethod3(lowered final core::String #this) → core::int
   return 586;
-static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|_privateMethod3(#this);
-static method _extension#0|publicStaticMethod3() → core::int*
+static method _extension#0|get#_privateMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|_privateMethod3(#this);
+static method _extension#0|publicStaticMethod3() → core::int
   return 374;
-static method _extension#0|_privateStaticMethod3() → core::int*
+static method _extension#0|_privateStaticMethod3() → core::int
   return 685;
-static method _extension#0|test3(lowered final core::String* #this) → dynamic {
+static method _extension#0|test3(lowered final core::String #this) → dynamic {
   pri::expect(473, pri::_extension#0|publicMethod3(#this));
   pri::expect(586, pri::_extension#0|_privateMethod3(#this));
   pri::expect(374, pri::_extension#0|publicStaticMethod3());
   pri::expect(685, pri::_extension#0|_privateStaticMethod3());
 }
-static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
+static method _extension#0|get#test3(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_extension#0|test3(#this);
 static method test() → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(""));
@@ -217,7 +217,7 @@
   pri::_extension#0|test3("");
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/private_members.dart.weak.outline.expect
index 5f25ddb..58a8257 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.weak.outline.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 
 import "org-dartlang-testcase:///private_members_lib.dart";
@@ -8,11 +8,11 @@
 static method errors() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-extension _PrivateExtension on core::String* {
+extension _PrivateExtension on core::String {
   method publicMethod1 = self2::_PrivateExtension|publicMethod1;
   tearoff publicMethod1 = self2::_PrivateExtension|get#publicMethod1;
   method _privateMethod1 = self2::_PrivateExtension|_privateMethod1;
@@ -22,7 +22,7 @@
   method test1 = self2::_PrivateExtension|test1;
   tearoff test1 = self2::_PrivateExtension|get#test1;
 }
-extension PublicExtension on core::String* {
+extension PublicExtension on core::String {
   method publicMethod2 = self2::PublicExtension|publicMethod2;
   tearoff publicMethod2 = self2::PublicExtension|get#publicMethod2;
   method _privateMethod2 = self2::PublicExtension|_privateMethod2;
@@ -32,7 +32,7 @@
   method test2 = self2::PublicExtension|test2;
   tearoff test2 = self2::PublicExtension|get#test2;
 }
-extension _extension#0 on core::String* {
+extension _extension#0 on core::String {
   method publicMethod3 = self2::_extension#0|publicMethod3;
   tearoff publicMethod3 = self2::_extension#0|get#publicMethod3;
   method _privateMethod3 = self2::_extension#0|_privateMethod3;
@@ -42,53 +42,53 @@
   method test3 = self2::_extension#0|test3;
   tearoff test3 = self2::_extension#0|get#test3;
 }
-static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|publicMethod1(lowered final core::String #this) → core::int
   ;
-static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::_PrivateExtension|publicMethod1(#this);
-static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|get#publicMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::_PrivateExtension|publicMethod1(#this);
+static method _PrivateExtension|_privateMethod1(lowered final core::String #this) → core::int
   ;
-static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::_PrivateExtension|_privateMethod1(#this);
-static method _PrivateExtension|publicStaticMethod1() → core::int*
+static method _PrivateExtension|get#_privateMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::_PrivateExtension|_privateMethod1(#this);
+static method _PrivateExtension|publicStaticMethod1() → core::int
   ;
-static method _PrivateExtension|_privateStaticMethod1() → core::int*
+static method _PrivateExtension|_privateStaticMethod1() → core::int
   ;
-static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic
+static method _PrivateExtension|test1(lowered final core::String #this) → dynamic
   ;
-static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
+static method _PrivateExtension|get#test1(lowered final core::String #this) → () → dynamic
   return () → dynamic => self2::_PrivateExtension|test1(#this);
-static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|publicMethod2(lowered final core::String #this) → core::int
   ;
-static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::PublicExtension|publicMethod2(#this);
-static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|get#publicMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::PublicExtension|publicMethod2(#this);
+static method PublicExtension|_privateMethod2(lowered final core::String #this) → core::int
   ;
-static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::PublicExtension|_privateMethod2(#this);
-static method PublicExtension|publicStaticMethod2() → core::int*
+static method PublicExtension|get#_privateMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::PublicExtension|_privateMethod2(#this);
+static method PublicExtension|publicStaticMethod2() → core::int
   ;
-static method PublicExtension|_privateStaticMethod2() → core::int*
+static method PublicExtension|_privateStaticMethod2() → core::int
   ;
-static method PublicExtension|test2(lowered final core::String* #this) → dynamic
+static method PublicExtension|test2(lowered final core::String #this) → dynamic
   ;
-static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
+static method PublicExtension|get#test2(lowered final core::String #this) → () → dynamic
   return () → dynamic => self2::PublicExtension|test2(#this);
-static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|publicMethod3(lowered final core::String #this) → core::int
   ;
-static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::_extension#0|publicMethod3(#this);
-static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|get#publicMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::_extension#0|publicMethod3(#this);
+static method _extension#0|_privateMethod3(lowered final core::String #this) → core::int
   ;
-static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => self2::_extension#0|_privateMethod3(#this);
-static method _extension#0|publicStaticMethod3() → core::int*
+static method _extension#0|get#_privateMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => self2::_extension#0|_privateMethod3(#this);
+static method _extension#0|publicStaticMethod3() → core::int
   ;
-static method _extension#0|_privateStaticMethod3() → core::int*
+static method _extension#0|_privateStaticMethod3() → core::int
   ;
-static method _extension#0|test3(lowered final core::String* #this) → dynamic
+static method _extension#0|test3(lowered final core::String #this) → dynamic
   ;
-static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
+static method _extension#0|get#test3(lowered final core::String #this) → () → dynamic
   return () → dynamic => self2::_extension#0|test3(#this);
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/private_members.dart.weak.transformed.expect
index 1e4a440..b67ccfa 100644
--- a/pkg/front_end/testcases/extensions/private_members.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/private_members.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -103,11 +103,11 @@
                               ^^^^^^^^^^^^^^^^^^^^^");
 }
 
-library;
+library /*isNonNullableByDefault*/;
 import self as pri;
 import "dart:core" as core;
 
-extension _PrivateExtension on core::String* {
+extension _PrivateExtension on core::String {
   method publicMethod1 = pri::_PrivateExtension|publicMethod1;
   tearoff publicMethod1 = pri::_PrivateExtension|get#publicMethod1;
   method _privateMethod1 = pri::_PrivateExtension|_privateMethod1;
@@ -117,7 +117,7 @@
   method test1 = pri::_PrivateExtension|test1;
   tearoff test1 = pri::_PrivateExtension|get#test1;
 }
-extension PublicExtension on core::String* {
+extension PublicExtension on core::String {
   method publicMethod2 = pri::PublicExtension|publicMethod2;
   tearoff publicMethod2 = pri::PublicExtension|get#publicMethod2;
   method _privateMethod2 = pri::PublicExtension|_privateMethod2;
@@ -127,7 +127,7 @@
   method test2 = pri::PublicExtension|test2;
   tearoff test2 = pri::PublicExtension|get#test2;
 }
-extension _extension#0 on core::String* {
+extension _extension#0 on core::String {
   method publicMethod3 = pri::_extension#0|publicMethod3;
   tearoff publicMethod3 = pri::_extension#0|get#publicMethod3;
   method _privateMethod3 = pri::_extension#0|_privateMethod3;
@@ -137,65 +137,65 @@
   method test3 = pri::_extension#0|test3;
   tearoff test3 = pri::_extension#0|get#test3;
 }
-static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|publicMethod1(lowered final core::String #this) → core::int
   return 42;
-static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|publicMethod1(#this);
-static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
+static method _PrivateExtension|get#publicMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|publicMethod1(#this);
+static method _PrivateExtension|_privateMethod1(lowered final core::String #this) → core::int
   return 87;
-static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_PrivateExtension|_privateMethod1(#this);
-static method _PrivateExtension|publicStaticMethod1() → core::int*
+static method _PrivateExtension|get#_privateMethod1(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_PrivateExtension|_privateMethod1(#this);
+static method _PrivateExtension|publicStaticMethod1() → core::int
   return 24;
-static method _PrivateExtension|_privateStaticMethod1() → core::int*
+static method _PrivateExtension|_privateStaticMethod1() → core::int
   return 78;
-static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic {
+static method _PrivateExtension|test1(lowered final core::String #this) → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(#this));
   pri::expect(87, pri::_PrivateExtension|_privateMethod1(#this));
   pri::expect(24, pri::_PrivateExtension|publicStaticMethod1());
   pri::expect(78, pri::_PrivateExtension|_privateStaticMethod1());
 }
-static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
+static method _PrivateExtension|get#test1(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_PrivateExtension|test1(#this);
-static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|publicMethod2(lowered final core::String #this) → core::int
   return 123;
-static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|publicMethod2(#this);
-static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
+static method PublicExtension|get#publicMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|publicMethod2(#this);
+static method PublicExtension|_privateMethod2(lowered final core::String #this) → core::int
   return 237;
-static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::PublicExtension|_privateMethod2(#this);
-static method PublicExtension|publicStaticMethod2() → core::int*
+static method PublicExtension|get#_privateMethod2(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::PublicExtension|_privateMethod2(#this);
+static method PublicExtension|publicStaticMethod2() → core::int
   return 321;
-static method PublicExtension|_privateStaticMethod2() → core::int*
+static method PublicExtension|_privateStaticMethod2() → core::int
   return 732;
-static method PublicExtension|test2(lowered final core::String* #this) → dynamic {
+static method PublicExtension|test2(lowered final core::String #this) → dynamic {
   pri::expect(123, pri::PublicExtension|publicMethod2(#this));
   pri::expect(237, pri::PublicExtension|_privateMethod2(#this));
   pri::expect(321, pri::PublicExtension|publicStaticMethod2());
   pri::expect(732, pri::PublicExtension|_privateStaticMethod2());
 }
-static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
+static method PublicExtension|get#test2(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::PublicExtension|test2(#this);
-static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|publicMethod3(lowered final core::String #this) → core::int
   return 473;
-static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|publicMethod3(#this);
-static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
+static method _extension#0|get#publicMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|publicMethod3(#this);
+static method _extension#0|_privateMethod3(lowered final core::String #this) → core::int
   return 586;
-static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
-  return () → core::int* => pri::_extension#0|_privateMethod3(#this);
-static method _extension#0|publicStaticMethod3() → core::int*
+static method _extension#0|get#_privateMethod3(lowered final core::String #this) → () → core::int
+  return () → core::int => pri::_extension#0|_privateMethod3(#this);
+static method _extension#0|publicStaticMethod3() → core::int
   return 374;
-static method _extension#0|_privateStaticMethod3() → core::int*
+static method _extension#0|_privateStaticMethod3() → core::int
   return 685;
-static method _extension#0|test3(lowered final core::String* #this) → dynamic {
+static method _extension#0|test3(lowered final core::String #this) → dynamic {
   pri::expect(473, pri::_extension#0|publicMethod3(#this));
   pri::expect(586, pri::_extension#0|_privateMethod3(#this));
   pri::expect(374, pri::_extension#0|publicStaticMethod3());
   pri::expect(685, pri::_extension#0|_privateStaticMethod3());
 }
-static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
+static method _extension#0|get#test3(lowered final core::String #this) → () → dynamic
   return () → dynamic => pri::_extension#0|test3(#this);
 static method test() → dynamic {
   pri::expect(42, pri::_PrivateExtension|publicMethod1(""));
@@ -217,7 +217,7 @@
   pri::_extension#0|test3("");
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/private_members_lib.dart b/pkg/front_end/testcases/extensions/private_members_lib.dart
index 4f5f780..2cf5032 100644
--- a/pkg/front_end/testcases/extensions/private_members_lib.dart
+++ b/pkg/front_end/testcases/extensions/private_members_lib.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 extension _PrivateExtension on String {
   int publicMethod1() => 42;
   int _privateMethod1() => 87;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart b/pkg/front_end/testcases/extensions/static_access.dart
index 37f9cf6..170f77e 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart
+++ b/pkg/front_end/testcases/extensions/static_access.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/static_access.dart.textual_outline.expect
index a124177..af89663 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/static_access.dart.textual_outline_modelled.expect
index 03ebb40..d7a88d1 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.weak.expect b/pkg/front_end/testcases/extensions/static_access.dart.weak.expect
index 973805f..91c0ad8 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.weak.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   static method method = self::Extension|method;
   static method genericMethod = self::Extension|genericMethod;
   static get property = get self::Extension|property;
@@ -30,20 +20,20 @@
 }
 static field dynamic Extension|field;
 static method Extension|method() → dynamic {}
-static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic {}
+static method Extension|genericMethod<T extends core::Object? = dynamic>(self::Extension|genericMethod::T% t) → dynamic {}
 static get Extension|property() → dynamic
   return 42;
 static set Extension|property(dynamic value) → void {}
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   self::Extension|method();
-  self::Extension|genericMethod<core::int*>(42);
-  self::Extension|genericMethod<core::num*>(42);
+  self::Extension|genericMethod<core::int>(42);
+  self::Extension|genericMethod<core::num>(42);
   #C1;
   #C2;
   self::Extension|property;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect
index 973805f..91c0ad8 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   static method method = self::Extension|method;
   static method genericMethod = self::Extension|genericMethod;
   static get property = get self::Extension|property;
@@ -30,20 +20,20 @@
 }
 static field dynamic Extension|field;
 static method Extension|method() → dynamic {}
-static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic {}
+static method Extension|genericMethod<T extends core::Object? = dynamic>(self::Extension|genericMethod::T% t) → dynamic {}
 static get Extension|property() → dynamic
   return 42;
 static set Extension|property(dynamic value) → void {}
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   self::Extension|method();
-  self::Extension|genericMethod<core::int*>(42);
-  self::Extension|genericMethod<core::num*>(42);
+  self::Extension|genericMethod<core::int>(42);
+  self::Extension|genericMethod<core::num>(42);
   #C1;
   #C2;
   self::Extension|property;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/static_access.dart.weak.outline.expect
index 362a61f..c0fe1cd 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.weak.outline.expect
@@ -1,22 +1,12 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   static method method = self::Extension|method;
   static method genericMethod = self::Extension|genericMethod;
   static get property = get self::Extension|property;
@@ -30,19 +20,19 @@
 static field dynamic Extension|field;
 static method Extension|method() → dynamic
   ;
-static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic
+static method Extension|genericMethod<T extends core::Object? = dynamic>(self::Extension|genericMethod::T% t) → dynamic
   ;
 static get Extension|property() → dynamic
   ;
 static set Extension|property(dynamic value) → void
   ;
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   ;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/static_access.dart.weak.transformed.expect
index 973805f..91c0ad8 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.weak.transformed.expect
@@ -1,23 +1,13 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   static method method = self::Extension|method;
   static method genericMethod = self::Extension|genericMethod;
   static get property = get self::Extension|property;
@@ -30,20 +20,20 @@
 }
 static field dynamic Extension|field;
 static method Extension|method() → dynamic {}
-static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic {}
+static method Extension|genericMethod<T extends core::Object? = dynamic>(self::Extension|genericMethod::T% t) → dynamic {}
 static get Extension|property() → dynamic
   return 42;
 static set Extension|property(dynamic value) → void {}
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   self::Extension|method();
-  self::Extension|genericMethod<core::int*>(42);
-  self::Extension|genericMethod<core::num*>(42);
+  self::Extension|genericMethod<core::int>(42);
+  self::Extension|genericMethod<core::num>(42);
   #C1;
   #C2;
   self::Extension|property;
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart b/pkg/front_end/testcases/extensions/static_access_of_instance.dart
index 7b664f9..606a735 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline.expect
index 2a3f073..38dbcbf 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline_modelled.expect
index 856f36c..114f677 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.expect
index b6e0e94..3fcfdf7 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -22,32 +22,22 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method instanceMethod = self::Extension|instanceMethod;
   tearoff instanceMethod = self::Extension|get#instanceMethod;
   get instanceProperty = self::Extension|get#instanceProperty;
   set instanceProperty = self::Extension|set#instanceProperty;
 }
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Member not found: 'Extension.instanceMethod'.
   Extension.instanceMethod();
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect
index b6e0e94..3fcfdf7 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -22,32 +22,22 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method instanceMethod = self::Extension|instanceMethod;
   tearoff instanceMethod = self::Extension|get#instanceMethod;
   get instanceProperty = self::Extension|get#instanceProperty;
   set instanceProperty = self::Extension|set#instanceProperty;
 }
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Member not found: 'Extension.instanceMethod'.
   Extension.instanceMethod();
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.outline.expect
index a401139..3dcb102 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.outline.expect
@@ -1,34 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method instanceMethod = self::Extension|instanceMethod;
   tearoff instanceMethod = self::Extension|get#instanceMethod;
   get instanceProperty = self::Extension|get#instanceProperty;
   set instanceProperty = self::Extension|set#instanceProperty;
 }
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic
   ;
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   ;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.transformed.expect
index b6e0e94..3fcfdf7 100644
--- a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.transformed.expect
@@ -1,4 +1,4 @@
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -22,32 +22,22 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  synthetic constructor •() → self::Class*
+  synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension on self::Class* {
+extension Extension on self::Class {
   method instanceMethod = self::Extension|instanceMethod;
   tearoff instanceMethod = self::Extension|get#instanceMethod;
   get instanceProperty = self::Extension|get#instanceProperty;
   set instanceProperty = self::Extension|set#instanceProperty;
 }
-static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
-static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+static method Extension|instanceMethod(lowered final self::Class #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class #this) → () → dynamic
   return () → dynamic => self::Extension|instanceMethod(#this);
-static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+static method Extension|get#instanceProperty(lowered final self::Class #this) → dynamic
   return 42;
-static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method Extension|set#instanceProperty(lowered final self::Class #this, dynamic value) → void {}
 static method main() → dynamic {
   invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Member not found: 'Extension.instanceMethod'.
   Extension.instanceMethod();
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart b/pkg/front_end/testcases/extensions/tear_offs.dart
index ce7b186..b683759 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Class {}
 
 extension Extension on Class {
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.expect
index d56bc4b..7c706bd 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
 //     int Function(int) intId = getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
 //   num Function(num) numId = c.getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
 //   bool Function(bool) boolId = Extension(c).getter;
 //                                             ^
 //
@@ -53,7 +53,7 @@
 static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
   return () → dynamic => self::Extension|method(#this);
 static method Extension|errors(lowered final self::Class* #this) → dynamic {
-  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
     int Function(int) intId = getter;
                               ^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
 }
@@ -66,10 +66,10 @@
 }
 static method errors() → dynamic {
   self::Class* c = new self::Class::•();
-  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
   num Function(num) numId = c.getter;
                               ^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
-  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
   bool Function(bool) boolId = Extension(c).getter;
                                             ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
 }
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect
index d56bc4b..7c706bd 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
 //     int Function(int) intId = getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
 //   num Function(num) numId = c.getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
 //   bool Function(bool) boolId = Extension(c).getter;
 //                                             ^
 //
@@ -53,7 +53,7 @@
 static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
   return () → dynamic => self::Extension|method(#this);
 static method Extension|errors(lowered final self::Class* #this) → dynamic {
-  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
     int Function(int) intId = getter;
                               ^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
 }
@@ -66,10 +66,10 @@
 }
 static method errors() → dynamic {
   self::Class* c = new self::Class::•();
-  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
   num Function(num) numId = c.getter;
                               ^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
-  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
   bool Function(bool) boolId = Extension(c).getter;
                                             ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
 }
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.transformed.expect
index d56bc4b..7c706bd 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
 //     int Function(int) intId = getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
 //   num Function(num) numId = c.getter;
 //                               ^
 //
-// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
 //   bool Function(bool) boolId = Extension(c).getter;
 //                                             ^
 //
@@ -53,7 +53,7 @@
 static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
   return () → dynamic => self::Extension|method(#this);
 static method Extension|errors(lowered final self::Class* #this) → dynamic {
-  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:19:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
     int Function(int) intId = getter;
                               ^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
 }
@@ -66,10 +66,10 @@
 }
 static method errors() → dynamic {
   self::Class* c = new self::Class::•();
-  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:32:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
   num Function(num) numId = c.getter;
                               ^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
-  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:33:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
   bool Function(bool) boolId = Extension(c).getter;
                                             ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
 }
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart b/pkg/front_end/testcases/extensions/tear_offs2.dart
new file mode 100644
index 0000000..910bae9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {}
+
+extension Extension on Class {
+  T id<T>(T t) => t;
+
+  T Function<T>(T) get getter => id;
+
+  method() {
+    String Function(String) stringId = id;
+  }
+
+  errors() {
+    int Function(int) intId = getter;
+  }
+}
+
+main() {
+  Class c = new Class();
+  int Function(int) intId = c.id;
+  double Function(double) doubleId = Extension(c).id;
+}
+
+errors() {
+  Class c = new Class();
+  num Function(num) numId = c.getter;
+  bool Function(bool) boolId = Extension(c).getter;
+}
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline.expect
new file mode 100644
index 0000000..45dbc23
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+class Class {}
+
+extension Extension on Class {
+  T id<T>(T t) => t;
+  T Function<T>(T) get getter => id;
+  method() {}
+  errors() {}
+}
+
+main() {}
+errors() {}
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5ce0c980
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class Class {}
+
+errors() {}
+
+extension Extension on Class {
+  T Function<T>(T) get getter => id;
+  T id<T>(T t) => t;
+  errors() {}
+  method() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.expect
new file mode 100644
index 0000000..6aad050
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  method id = self::Extension|id;
+  tearoff id = self::Extension|get#id;
+  get getter = self::Extension|get#getter;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method errors = self::Extension|errors;
+  tearoff errors = self::Extension|get#errors;
+}
+static method Extension|id<T extends core::Object? = dynamic>(lowered final self::Class #this, self::Extension|id::T% t) → self::Extension|id::T%
+  return t;
+static method Extension|get#id(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return <T extends core::Object? = dynamic>(T% t) → T% => self::Extension|id<T%>(#this, t);
+static method Extension|get#getter(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return self::Extension|get#id(#this);
+static method Extension|method(lowered final self::Class #this) → dynamic {
+  (core::String) → core::String stringId = self::Extension|get#id(#this)<core::String>;
+}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method Extension|errors(lowered final self::Class #this) → dynamic {
+  (core::int) → core::int intId = self::Extension|get#getter(#this)<core::int>;
+}
+static method Extension|get#errors(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|errors(#this);
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int) → core::int intId = self::Extension|get#id(c)<core::int>;
+  (core::double) → core::double doubleId = self::Extension|get#id(c)<core::double>;
+}
+static method errors() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::num) → core::num numId = self::Extension|get#getter(c)<core::num>;
+  (core::bool) → core::bool boolId = self::Extension|get#getter(c)<core::bool>;
+}
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.modular.expect
new file mode 100644
index 0000000..6aad050
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  method id = self::Extension|id;
+  tearoff id = self::Extension|get#id;
+  get getter = self::Extension|get#getter;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method errors = self::Extension|errors;
+  tearoff errors = self::Extension|get#errors;
+}
+static method Extension|id<T extends core::Object? = dynamic>(lowered final self::Class #this, self::Extension|id::T% t) → self::Extension|id::T%
+  return t;
+static method Extension|get#id(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return <T extends core::Object? = dynamic>(T% t) → T% => self::Extension|id<T%>(#this, t);
+static method Extension|get#getter(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return self::Extension|get#id(#this);
+static method Extension|method(lowered final self::Class #this) → dynamic {
+  (core::String) → core::String stringId = self::Extension|get#id(#this)<core::String>;
+}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method Extension|errors(lowered final self::Class #this) → dynamic {
+  (core::int) → core::int intId = self::Extension|get#getter(#this)<core::int>;
+}
+static method Extension|get#errors(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|errors(#this);
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int) → core::int intId = self::Extension|get#id(c)<core::int>;
+  (core::double) → core::double doubleId = self::Extension|get#id(c)<core::double>;
+}
+static method errors() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::num) → core::num numId = self::Extension|get#getter(c)<core::num>;
+  (core::bool) → core::bool boolId = self::Extension|get#getter(c)<core::bool>;
+}
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.outline.expect
new file mode 100644
index 0000000..c5df276
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.outline.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    ;
+}
+extension Extension on self::Class {
+  method id = self::Extension|id;
+  tearoff id = self::Extension|get#id;
+  get getter = self::Extension|get#getter;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method errors = self::Extension|errors;
+  tearoff errors = self::Extension|get#errors;
+}
+static method Extension|id<T extends core::Object? = dynamic>(lowered final self::Class #this, self::Extension|id::T% t) → self::Extension|id::T%
+  ;
+static method Extension|get#id(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return <T extends core::Object? = dynamic>(T% t) → T% => self::Extension|id<T%>(#this, t);
+static method Extension|get#getter(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  ;
+static method Extension|method(lowered final self::Class #this) → dynamic
+  ;
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method Extension|errors(lowered final self::Class #this) → dynamic
+  ;
+static method Extension|get#errors(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|errors(#this);
+static method main() → dynamic
+  ;
+static method errors() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.transformed.expect
new file mode 100644
index 0000000..6aad050
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs2.dart.weak.transformed.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class {
+  method id = self::Extension|id;
+  tearoff id = self::Extension|get#id;
+  get getter = self::Extension|get#getter;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method errors = self::Extension|errors;
+  tearoff errors = self::Extension|get#errors;
+}
+static method Extension|id<T extends core::Object? = dynamic>(lowered final self::Class #this, self::Extension|id::T% t) → self::Extension|id::T%
+  return t;
+static method Extension|get#id(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return <T extends core::Object? = dynamic>(T% t) → T% => self::Extension|id<T%>(#this, t);
+static method Extension|get#getter(lowered final self::Class #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return self::Extension|get#id(#this);
+static method Extension|method(lowered final self::Class #this) → dynamic {
+  (core::String) → core::String stringId = self::Extension|get#id(#this)<core::String>;
+}
+static method Extension|get#method(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method Extension|errors(lowered final self::Class #this) → dynamic {
+  (core::int) → core::int intId = self::Extension|get#getter(#this)<core::int>;
+}
+static method Extension|get#errors(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|errors(#this);
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int) → core::int intId = self::Extension|get#id(c)<core::int>;
+  (core::double) → core::double doubleId = self::Extension|get#id(c)<core::double>;
+}
+static method errors() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::num) → core::num numId = self::Extension|get#getter(c)<core::num>;
+  (core::bool) → core::bool boolId = self::Extension|get#getter(c)<core::bool>;
+}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart b/pkg/front_end/testcases/extensions/type_variable_bound.dart
index 2d98762d..5adb87c 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart
@@ -1,8 +1,8 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
-// @dart=2.8
 
 extension Extension<T> on T {
   T method1() => this;
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect
index 23bbc97..4bd6f06 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect
@@ -1,5 +1,4 @@
 // @dart = 2.9
-// @dart = 2.8
 extension Extension<T> on T {
   T method1() => this;
 }
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline_modelled.expect
index 3dcbad3..3f5d1a5 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline_modelled.expect
@@ -1,5 +1,4 @@
 // @dart = 2.9
-// @dart = 2.8
 Class test1<T>(T t1) {}
 
 class Class {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart b/pkg/front_end/testcases/extensions/type_variable_bound2.dart
new file mode 100644
index 0000000..82744c3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension Extension<T> on T {
+  T method1() => this;
+}
+
+extension BoundExtension<T extends Class> on T {
+  T method2() => this;
+}
+
+class Class {}
+
+class SubClass extends Class {}
+
+Class test1<T>(T t1) {
+  if (t1 is SubClass) {
+    return t1.method1() as SubClass;
+  }
+  return new Class();
+}
+
+test2<T extends Class>(T t2) {
+  if (T == SubClass) {
+    SubClass subClass = t2.method2() as SubClass;
+  }
+}
+
+test3<T>(T t3) {
+  if (t3 is SubClass) {
+    SubClass subClass = t3.method2() as SubClass; // error
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline.expect
new file mode 100644
index 0000000..7f86fba
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline.expect
@@ -0,0 +1,16 @@
+extension Extension<T> on T {
+  T method1() => this;
+}
+
+extension BoundExtension<T extends Class> on T {
+  T method2() => this;
+}
+
+class Class {}
+
+class SubClass extends Class {}
+
+Class test1<T>(T t1) {}
+test2<T extends Class>(T t2) {}
+test3<T>(T t3) {}
+main() {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d20dc15
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+Class test1<T>(T t1) {}
+
+class Class {}
+
+class SubClass extends Class {}
+
+extension BoundExtension<T extends Class> on T {
+  T method2() => this;
+}
+
+extension Extension<T> on T {
+  T method1() => this;
+}
+
+main() {}
+test2<T extends Class>(T t2) {}
+test3<T>(T t3) {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.expect
new file mode 100644
index 0000000..d5f25e2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2() as SubClass; // error
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{ForNonNullableByDefault} self::SubClass;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T =={core::Type::==}{(core::Object) → core::bool} #C1) {
+    self::SubClass subClass = self::BoundExtension|method2<self::test2::T>(t2) as{ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2() as SubClass; // error
+                           ^^^^^^^" in t3{self::test3::T% & self::SubClass /* '%' & '!' = '!' */}{<unresolved>}.method2() as{ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::SubClass*)
+}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.modular.expect
new file mode 100644
index 0000000..d5f25e2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2() as SubClass; // error
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{ForNonNullableByDefault} self::SubClass;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T =={core::Type::==}{(core::Object) → core::bool} #C1) {
+    self::SubClass subClass = self::BoundExtension|method2<self::test2::T>(t2) as{ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2() as SubClass; // error
+                           ^^^^^^^" in t3{self::test3::T% & self::SubClass /* '%' & '!' = '!' */}{<unresolved>}.method2() as{ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::SubClass*)
+}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.outline.expect
new file mode 100644
index 0000000..1a7ba19
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.outline.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  ;
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  ;
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class
+  ;
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic
+  ;
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.transformed.expect
new file mode 100644
index 0000000..0c70fa2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound2.dart.weak.transformed.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2() as SubClass; // error
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{ForNonNullableByDefault} self::SubClass;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T =={core::Type::==}{(core::Object) → core::bool} #C1) {
+    self::SubClass subClass = self::BoundExtension|method2<self::test2::T>(t2) as{ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/extensions/type_variable_bound2.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/extensions/type_variable_bound2.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2() as SubClass; // error
+                           ^^^^^^^" in t3{self::test3::T% & self::SubClass /* '%' & '!' = '!' */}{<unresolved>}.method2();
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::SubClass*)
+}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart b/pkg/front_end/testcases/extensions/type_variables.dart
index c17dbcb..bea2ded 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart
+++ b/pkg/front_end/testcases/extensions/type_variables.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class A1<T> {}
 
 extension A2<T> on A1<T> {
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline.expect
index 28326e8..4f3bfdf 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A1<T> {}
 
 extension A2<T> on A1<T> {
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline_modelled.expect
index 28326e8..4f3bfdf 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A1<T> {}
 
 extension A2<T> on A1<T> {
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.weak.expect b/pkg/front_end/testcases/extensions/type_variables.dart.weak.expect
index aeae0f7..ef08b8e 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.weak.expect
@@ -1,48 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A1<self::A1::T*>*
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A2<T extends core::Object? = dynamic> on self::A1<T%> {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension A3<T extends self::A1<T*>* = self::A1<dynamic>*> on self::A1<T*>* {
+extension A3<T extends self::A1<T> = self::A1<dynamic>> on self::A1<T> {
 }
-extension A4<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A4<T extends core::Object? = dynamic> on self::A1<T%> {
   method method = self::A4|method;
   tearoff method = self::A4|get#method;
 }
-static method A2|method1<T extends core::Object* = dynamic, S extends self::A2|method1::T* = dynamic>(lowered final self::A1<self::A2|method1::T*>* #this) → self::A1<self::A2|method1::T*>* {
+static method A2|method1<T extends core::Object? = dynamic, S extends self::A2|method1::T% = dynamic>(lowered final self::A1<self::A2|method1::T%> #this) → self::A1<self::A2|method1::T%> {
   return #this;
 }
-static method A2|get#method1<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method1::T*>* #this) → <S extends self::A2|get#method1::T* = dynamic>() →* self::A1<self::A2|get#method1::T*>*
-  return <S extends self::A2|get#method1::T* = dynamic>() → self::A1<self::A2|get#method1::T*>* => self::A2|method1<self::A2|get#method1::T*, S*>(#this);
-static method A2|method2<T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::T*>* = self::A1<dynamic>*>(lowered final self::A1<self::A2|method2::T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::T*>* {
+static method A2|get#method1<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method1::T%> #this) → <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%>
+  return <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%> => self::A2|method1<self::A2|get#method1::T%, S%>(#this);
+static method A2|method2<T extends core::Object? = dynamic, S extends self::A1<self::A2|method2::T%> = self::A1<dynamic>>(lowered final self::A1<self::A2|method2::T%> #this, self::A2|method2::S o) → self::A1<self::A2|method2::T%> {
   core::print(o);
-  core::print(self::A2|method2::T*);
-  core::print(self::A2|method2::S*);
+  core::print(self::A2|method2::T%);
+  core::print(self::A2|method2::S);
   return #this;
 }
-static method A2|get#method2<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method2::T*>* #this) → <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S*) →* self::A1<self::A2|get#method2::T*>*
-  return <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S* o) → self::A1<self::A2|get#method2::T*>* => self::A2|method2<self::A2|get#method2::T*, S*>(#this, o);
-static method A4|method<#T extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final self::A1<self::A4|method::#T*>* #this) → dynamic {}
-static method A4|get#method<#T extends core::Object* = dynamic>(lowered final self::A1<self::A4|get#method::#T*>* #this) → <T extends core::Object* = dynamic>() →* dynamic
-  return <T extends core::Object* = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T*, T*>(#this);
+static method A2|get#method2<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method2::T%> #this) → <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S) → self::A1<self::A2|get#method2::T%>
+  return <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S o) → self::A1<self::A2|get#method2::T%> => self::A2|method2<self::A2|get#method2::T%, S>(#this, o);
+static method A4|method<#T extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final self::A1<self::A4|method::#T%> #this) → dynamic {}
+static method A4|get#method<#T extends core::Object? = dynamic>(lowered final self::A1<self::A4|get#method::#T%> #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T%, T%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect
index aeae0f7..ef08b8e 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect
@@ -1,48 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A1<self::A1::T*>*
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A2<T extends core::Object? = dynamic> on self::A1<T%> {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension A3<T extends self::A1<T*>* = self::A1<dynamic>*> on self::A1<T*>* {
+extension A3<T extends self::A1<T> = self::A1<dynamic>> on self::A1<T> {
 }
-extension A4<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A4<T extends core::Object? = dynamic> on self::A1<T%> {
   method method = self::A4|method;
   tearoff method = self::A4|get#method;
 }
-static method A2|method1<T extends core::Object* = dynamic, S extends self::A2|method1::T* = dynamic>(lowered final self::A1<self::A2|method1::T*>* #this) → self::A1<self::A2|method1::T*>* {
+static method A2|method1<T extends core::Object? = dynamic, S extends self::A2|method1::T% = dynamic>(lowered final self::A1<self::A2|method1::T%> #this) → self::A1<self::A2|method1::T%> {
   return #this;
 }
-static method A2|get#method1<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method1::T*>* #this) → <S extends self::A2|get#method1::T* = dynamic>() →* self::A1<self::A2|get#method1::T*>*
-  return <S extends self::A2|get#method1::T* = dynamic>() → self::A1<self::A2|get#method1::T*>* => self::A2|method1<self::A2|get#method1::T*, S*>(#this);
-static method A2|method2<T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::T*>* = self::A1<dynamic>*>(lowered final self::A1<self::A2|method2::T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::T*>* {
+static method A2|get#method1<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method1::T%> #this) → <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%>
+  return <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%> => self::A2|method1<self::A2|get#method1::T%, S%>(#this);
+static method A2|method2<T extends core::Object? = dynamic, S extends self::A1<self::A2|method2::T%> = self::A1<dynamic>>(lowered final self::A1<self::A2|method2::T%> #this, self::A2|method2::S o) → self::A1<self::A2|method2::T%> {
   core::print(o);
-  core::print(self::A2|method2::T*);
-  core::print(self::A2|method2::S*);
+  core::print(self::A2|method2::T%);
+  core::print(self::A2|method2::S);
   return #this;
 }
-static method A2|get#method2<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method2::T*>* #this) → <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S*) →* self::A1<self::A2|get#method2::T*>*
-  return <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S* o) → self::A1<self::A2|get#method2::T*>* => self::A2|method2<self::A2|get#method2::T*, S*>(#this, o);
-static method A4|method<#T extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final self::A1<self::A4|method::#T*>* #this) → dynamic {}
-static method A4|get#method<#T extends core::Object* = dynamic>(lowered final self::A1<self::A4|get#method::#T*>* #this) → <T extends core::Object* = dynamic>() →* dynamic
-  return <T extends core::Object* = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T*, T*>(#this);
+static method A2|get#method2<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method2::T%> #this) → <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S) → self::A1<self::A2|get#method2::T%>
+  return <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S o) → self::A1<self::A2|get#method2::T%> => self::A2|method2<self::A2|get#method2::T%, S>(#this, o);
+static method A4|method<#T extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final self::A1<self::A4|method::#T%> #this) → dynamic {}
+static method A4|get#method<#T extends core::Object? = dynamic>(lowered final self::A1<self::A4|get#method::#T%> #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T%, T%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/type_variables.dart.weak.outline.expect
index 38ec5af..bae3a86 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.weak.outline.expect
@@ -1,44 +1,34 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A1<self::A1::T*>*
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A2<T extends core::Object? = dynamic> on self::A1<T%> {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension A3<T extends self::A1<T*>* = self::A1<dynamic>*> on self::A1<T*>* {
+extension A3<T extends self::A1<T> = self::A1<dynamic>> on self::A1<T> {
 }
-extension A4<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A4<T extends core::Object? = dynamic> on self::A1<T%> {
   method method = self::A4|method;
   tearoff method = self::A4|get#method;
 }
-static method A2|method1<T extends core::Object* = dynamic, S extends self::A2|method1::T* = dynamic>(lowered final self::A1<self::A2|method1::T*>* #this) → self::A1<self::A2|method1::T*>*
+static method A2|method1<T extends core::Object? = dynamic, S extends self::A2|method1::T% = dynamic>(lowered final self::A1<self::A2|method1::T%> #this) → self::A1<self::A2|method1::T%>
   ;
-static method A2|get#method1<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method1::T*>* #this) → <S extends self::A2|get#method1::T* = dynamic>() →* self::A1<self::A2|get#method1::T*>*
-  return <S extends self::A2|get#method1::T* = dynamic>() → self::A1<self::A2|get#method1::T*>* => self::A2|method1<self::A2|get#method1::T*, S*>(#this);
-static method A2|method2<T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::T*>* = self::A1<dynamic>*>(lowered final self::A1<self::A2|method2::T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::T*>*
+static method A2|get#method1<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method1::T%> #this) → <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%>
+  return <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%> => self::A2|method1<self::A2|get#method1::T%, S%>(#this);
+static method A2|method2<T extends core::Object? = dynamic, S extends self::A1<self::A2|method2::T%> = self::A1<dynamic>>(lowered final self::A1<self::A2|method2::T%> #this, self::A2|method2::S o) → self::A1<self::A2|method2::T%>
   ;
-static method A2|get#method2<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method2::T*>* #this) → <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S*) →* self::A1<self::A2|get#method2::T*>*
-  return <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S* o) → self::A1<self::A2|get#method2::T*>* => self::A2|method2<self::A2|get#method2::T*, S*>(#this, o);
-static method A4|method<#T extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final self::A1<self::A4|method::#T*>* #this) → dynamic
+static method A2|get#method2<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method2::T%> #this) → <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S) → self::A1<self::A2|get#method2::T%>
+  return <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S o) → self::A1<self::A2|get#method2::T%> => self::A2|method2<self::A2|get#method2::T%, S>(#this, o);
+static method A4|method<#T extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final self::A1<self::A4|method::#T%> #this) → dynamic
   ;
-static method A4|get#method<#T extends core::Object* = dynamic>(lowered final self::A1<self::A4|get#method::#T*>* #this) → <T extends core::Object* = dynamic>() →* dynamic
-  return <T extends core::Object* = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T*, T*>(#this);
+static method A4|get#method<#T extends core::Object? = dynamic>(lowered final self::A1<self::A4|get#method::#T%> #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T%, T%>(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/type_variables.dart.weak.transformed.expect
index aeae0f7..ef08b8e 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.weak.transformed.expect
@@ -1,48 +1,38 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
-class A1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A1<self::A1::T*>*
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A2<T extends core::Object? = dynamic> on self::A1<T%> {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension A3<T extends self::A1<T*>* = self::A1<dynamic>*> on self::A1<T*>* {
+extension A3<T extends self::A1<T> = self::A1<dynamic>> on self::A1<T> {
 }
-extension A4<T extends core::Object* = dynamic> on self::A1<T*>* {
+extension A4<T extends core::Object? = dynamic> on self::A1<T%> {
   method method = self::A4|method;
   tearoff method = self::A4|get#method;
 }
-static method A2|method1<T extends core::Object* = dynamic, S extends self::A2|method1::T* = dynamic>(lowered final self::A1<self::A2|method1::T*>* #this) → self::A1<self::A2|method1::T*>* {
+static method A2|method1<T extends core::Object? = dynamic, S extends self::A2|method1::T% = dynamic>(lowered final self::A1<self::A2|method1::T%> #this) → self::A1<self::A2|method1::T%> {
   return #this;
 }
-static method A2|get#method1<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method1::T*>* #this) → <S extends self::A2|get#method1::T* = dynamic>() →* self::A1<self::A2|get#method1::T*>*
-  return <S extends self::A2|get#method1::T* = dynamic>() → self::A1<self::A2|get#method1::T*>* => self::A2|method1<self::A2|get#method1::T*, S*>(#this);
-static method A2|method2<T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::T*>* = self::A1<dynamic>*>(lowered final self::A1<self::A2|method2::T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::T*>* {
+static method A2|get#method1<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method1::T%> #this) → <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%>
+  return <S extends self::A2|get#method1::T% = dynamic>() → self::A1<self::A2|get#method1::T%> => self::A2|method1<self::A2|get#method1::T%, S%>(#this);
+static method A2|method2<T extends core::Object? = dynamic, S extends self::A1<self::A2|method2::T%> = self::A1<dynamic>>(lowered final self::A1<self::A2|method2::T%> #this, self::A2|method2::S o) → self::A1<self::A2|method2::T%> {
   core::print(o);
-  core::print(self::A2|method2::T*);
-  core::print(self::A2|method2::S*);
+  core::print(self::A2|method2::T%);
+  core::print(self::A2|method2::S);
   return #this;
 }
-static method A2|get#method2<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method2::T*>* #this) → <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S*) →* self::A1<self::A2|get#method2::T*>*
-  return <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S* o) → self::A1<self::A2|get#method2::T*>* => self::A2|method2<self::A2|get#method2::T*, S*>(#this, o);
-static method A4|method<#T extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final self::A1<self::A4|method::#T*>* #this) → dynamic {}
-static method A4|get#method<#T extends core::Object* = dynamic>(lowered final self::A1<self::A4|get#method::#T*>* #this) → <T extends core::Object* = dynamic>() →* dynamic
-  return <T extends core::Object* = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T*, T*>(#this);
+static method A2|get#method2<T extends core::Object? = dynamic>(lowered final self::A1<self::A2|get#method2::T%> #this) → <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S) → self::A1<self::A2|get#method2::T%>
+  return <S extends self::A1<self::A2|get#method2::T%> = self::A1<dynamic>>(S o) → self::A1<self::A2|get#method2::T%> => self::A2|method2<self::A2|get#method2::T%, S>(#this, o);
+static method A4|method<#T extends core::Object? = dynamic, T extends core::Object? = dynamic>(lowered final self::A1<self::A4|method::#T%> #this) → dynamic {}
+static method A4|get#method<#T extends core::Object? = dynamic>(lowered final self::A1<self::A4|get#method::#T%> #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T%, T%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart b/pkg/front_end/testcases/extensions/unnamed_extensions.dart
index bf0bddc..58eecf4 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// @dart=2.9
+
 class Class1 {
   int field;
 
@@ -23,7 +23,7 @@
     print('Extension1.method on $this');
     return field;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension1.genericMethod<$T>($t) on $this');
     return field + t;
   }
@@ -44,7 +44,7 @@
     print('Extension2.method on $this');
     return field + 3;
   }
-  int genericMethod<T extends num>(T t) {
+  num genericMethod<T extends num>(T t) {
     print('Extension2.genericMethod<$T>($t) on $this');
     return field + t + 4;
   }
@@ -60,22 +60,24 @@
 }
 
 main() {
-  testExtension1();
-  testExtension2();
+  Class1 c10 = new Class1(0);
+  Class1 c11 = new Class1(1);
+  testExtension1(c10, c11, c10, c11);
+  Class2 c20 = new Class2(0);
+  Class2 c21 = new Class2(1);
+  testExtension2(c20, c21, c20);
 }
 
-testExtension1() {
-  Class1 c0 = new Class1(0);
-  Class1 c1 = new Class1(1);
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {
   expect(0, c0.method());
   expect(1, c1.method());
-  expect(1, c1?.method());
+  expect(1, c1n?.method());
   expect(42, c0.genericMethod(42));
   expect(43, c0.genericMethod<num>(43));
   expect(88, c1.genericMethod(87));
   expect(89, c1.genericMethod<num>(88));
   expect(0, c0.property);
-  expect(0, c0?.property);
+  expect(0, c0n?.property);
   expect(42, c0.property = 42);
   expect(1, c1.property);
   expect(87, c0.property = 87);
@@ -85,18 +87,16 @@
   expect(67, c0.property = c1.property = c0.property = 67);
 }
 
-testExtension2() {
-  Class2 c0 = new Class2(0);
-  Class2 c1 = new Class2(1);
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {
   expect(3, c0.method());
-  expect(3, c0?.method());
+  expect(3, c0n?.method());
   expect(4, c1.method());
   expect(46, c0.genericMethod(42));
   expect(47, c0.genericMethod<num>(43));
   expect(92, c1.genericMethod(87));
   expect(93, c1.genericMethod<num>(88));
   expect(5, c0.property);
-  expect(5, c0?.property);
+  expect(5, c0n?.property);
   expect(42, c0.property = 42);
   expect(48, c0.property);
   expect(6, c1.property);
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline.expect
index 4120a4e..c1ec591 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   int field;
   Class1(this.field);
@@ -13,19 +12,19 @@
 
 extension on Class1 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
   int get property {}
   set property(int value) {}
 }
 
 extension on Class2 {
   int method() {}
-  int genericMethod<T extends num>(T t) {}
+  num genericMethod<T extends num>(T t) {}
   int get property {}
   set property(int value) {}
 }
 
 main() {}
-testExtension1() {}
-testExtension2() {}
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {}
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {}
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline_modelled.expect
index d2ab91a..77bfd33 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class Class1 {
   Class1(this.field);
   String toString() => 'Class1($field)';
@@ -14,19 +13,19 @@
 expect(expected, actual) {}
 
 extension on Class1 {
-  int genericMethod<T extends num>(T t) {}
   int get property {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
   set property(int value) {}
 }
 
 extension on Class2 {
-  int genericMethod<T extends num>(T t) {}
   int get property {}
   int method() {}
+  num genericMethod<T extends num>(T t) {}
   set property(int value) {}
 }
 
 main() {}
-testExtension1() {}
-testExtension2() {}
+testExtension1(Class1 c0, Class1 c1, Class1? c0n, Class1? c1n) {}
+testExtension2(Class2 c0, Class2 c1, Class2? c0n) {}
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
index 6532400..d69a033 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension _extension#0 on self::Class1* {
+extension _extension#0 on self::Class1 {
   method method = self::_extension#0|method;
   tearoff method = self::_extension#0|get#method;
   method genericMethod = self::_extension#0|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::_extension#0|get#property;
   set property = self::_extension#0|set#property;
 }
-extension _extension#1 on self::Class2* {
+extension _extension#1 on self::Class2 {
   method method = self::_extension#1|method;
   tearoff method = self::_extension#1|get#method;
   method genericMethod = self::_extension#1|genericMethod;
@@ -52,96 +34,96 @@
   get property = self::_extension#1|get#property;
   set property = self::_extension#1|set#property;
 }
-static method _extension#0|method(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#0|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::_extension#0|method(#this);
+static method _extension#0|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::_extension#0|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
-static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#0|genericMethod<T>(#this, t);
+static method _extension#0|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method _extension#0|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method _extension#1|method(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#1|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::_extension#1|method(#this);
+static method _extension#1|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::_extension#1|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
-static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#1|genericMethod<T>(#this, t);
+static method _extension#1|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method _extension#1|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::_extension#0|method(c0));
   self::expect(1, self::_extension#0|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::_extension#0|method(#t1));
-  self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::_extension#0|method(#t1{self::Class1}));
+  self::expect(42, self::_extension#0|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::_extension#0|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::_extension#0|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::_extension#0|genericMethod<core::num>(c1, 88));
   self::expect(0, self::_extension#0|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::_extension#0|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::_extension#0|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
   self::expect(1, self::_extension#0|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::_extension#1|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::_extension#1|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::_extension#1|method(#t27{self::Class2}));
   self::expect(4, self::_extension#1|method(c1));
-  self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::_extension#1|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::_extension#1|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::_extension#1|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::_extension#1|genericMethod<core::num>(c1, 88));
   self::expect(5, self::_extension#1|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::_extension#1|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::_extension#1|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
   self::expect(48, self::_extension#1|get#property(c0));
   self::expect(6, self::_extension#1|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
   self::expect(49, self::_extension#1|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect
index 6532400..d69a033 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension _extension#0 on self::Class1* {
+extension _extension#0 on self::Class1 {
   method method = self::_extension#0|method;
   tearoff method = self::_extension#0|get#method;
   method genericMethod = self::_extension#0|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::_extension#0|get#property;
   set property = self::_extension#0|set#property;
 }
-extension _extension#1 on self::Class2* {
+extension _extension#1 on self::Class2 {
   method method = self::_extension#1|method;
   tearoff method = self::_extension#1|get#method;
   method genericMethod = self::_extension#1|genericMethod;
@@ -52,96 +34,96 @@
   get property = self::_extension#1|get#property;
   set property = self::_extension#1|set#property;
 }
-static method _extension#0|method(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#0|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::_extension#0|method(#this);
+static method _extension#0|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::_extension#0|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
-static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#0|genericMethod<T>(#this, t);
+static method _extension#0|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method _extension#0|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method _extension#1|method(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#1|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::_extension#1|method(#this);
+static method _extension#1|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::_extension#1|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
-static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#1|genericMethod<T>(#this, t);
+static method _extension#1|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method _extension#1|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::_extension#0|method(c0));
   self::expect(1, self::_extension#0|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::_extension#0|method(#t1));
-  self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::_extension#0|method(#t1{self::Class1}));
+  self::expect(42, self::_extension#0|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::_extension#0|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::_extension#0|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::_extension#0|genericMethod<core::num>(c1, 88));
   self::expect(0, self::_extension#0|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::_extension#0|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::_extension#0|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
   self::expect(1, self::_extension#0|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::_extension#1|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::_extension#1|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::_extension#1|method(#t27{self::Class2}));
   self::expect(4, self::_extension#1|method(c1));
-  self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::_extension#1|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::_extension#1|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::_extension#1|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::_extension#1|genericMethod<core::num>(c1, 88));
   self::expect(5, self::_extension#1|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::_extension#1|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::_extension#1|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
   self::expect(48, self::_extension#1|get#property(c0));
   self::expect(6, self::_extension#1|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
   self::expect(49, self::_extension#1|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
index 7880975..fd6ebb3 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
@@ -1,40 +1,22 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     ;
-  method toString() → core::String*
+  method toString() → core::String
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension _extension#0 on self::Class1* {
+extension _extension#0 on self::Class1 {
   method method = self::_extension#0|method;
   tearoff method = self::_extension#0|get#method;
   method genericMethod = self::_extension#0|genericMethod;
@@ -42,7 +24,7 @@
   get property = self::_extension#0|get#property;
   set property = self::_extension#0|set#property;
 }
-extension _extension#1 on self::Class2* {
+extension _extension#1 on self::Class2 {
   method method = self::_extension#1|method;
   tearoff method = self::_extension#1|get#method;
   method genericMethod = self::_extension#1|genericMethod;
@@ -50,35 +32,35 @@
   get property = self::_extension#1|get#property;
   set property = self::_extension#1|set#property;
 }
-static method _extension#0|method(lowered final self::Class1* #this) → core::int*
+static method _extension#0|method(lowered final self::Class1 #this) → core::int
   ;
-static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int*
+static method _extension#0|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::_extension#0|method(#this);
+static method _extension#0|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::_extension#0|genericMethod::T t) → core::num
   ;
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
-static method _extension#0|get#property(lowered final self::Class1* #this) → core::int*
+static method _extension#0|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#0|genericMethod<T>(#this, t);
+static method _extension#0|get#property(lowered final self::Class1 #this) → core::int
   ;
-static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void
+static method _extension#0|set#property(lowered final self::Class1 #this, core::int value) → void
   ;
-static method _extension#1|method(lowered final self::Class2* #this) → core::int*
+static method _extension#1|method(lowered final self::Class2 #this) → core::int
   ;
-static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int*
+static method _extension#1|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::_extension#1|method(#this);
+static method _extension#1|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::_extension#1|genericMethod::T t) → core::num
   ;
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
-static method _extension#1|get#property(lowered final self::Class2* #this) → core::int*
+static method _extension#1|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#1|genericMethod<T>(#this, t);
+static method _extension#1|get#property(lowered final self::Class2 #this) → core::int
   ;
-static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void
+static method _extension#1|set#property(lowered final self::Class2 #this, core::int value) → void
   ;
 static method main() → dynamic
   ;
-static method testExtension1() → dynamic
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic
   ;
-static method testExtension2() → dynamic
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
index f3b4c97..82dee77 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
@@ -1,42 +1,24 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class Class1 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class1*
+  field core::int field;
+  constructor •(core::int field) → self::Class1
     : self::Class1::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class1(${this.{self::Class1::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class1(${this.{self::Class1::field}{core::int}})";
 }
 class Class2 extends core::Object {
-  field core::int* field;
-  constructor •(core::int* field) → self::Class2*
+  field core::int field;
+  constructor •(core::int field) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
-  method toString() → core::String*
-    return "Class2(${this.{self::Class2::field}{core::int*}})";
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method toString() → core::String
+    return "Class2(${this.{self::Class2::field}{core::int}})";
 }
-extension _extension#0 on self::Class1* {
+extension _extension#0 on self::Class1 {
   method method = self::_extension#0|method;
   tearoff method = self::_extension#0|get#method;
   method genericMethod = self::_extension#0|genericMethod;
@@ -44,7 +26,7 @@
   get property = self::_extension#0|get#property;
   set property = self::_extension#0|set#property;
 }
-extension _extension#1 on self::Class2* {
+extension _extension#1 on self::Class2 {
   method method = self::_extension#1|method;
   tearoff method = self::_extension#1|get#method;
   method genericMethod = self::_extension#1|genericMethod;
@@ -52,116 +34,116 @@
   get property = self::_extension#1|get#property;
   set property = self::_extension#1|set#property;
 }
-static method _extension#0|method(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|method(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.method on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
-  return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
-  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#0|get#method(lowered final self::Class1 #this) → () → core::int
+  return () → core::int => self::_extension#0|method(#this);
+static method _extension#0|genericMethod<T extends core::num>(lowered final self::Class1 #this, self::_extension#0|genericMethod::T t) → core::num {
+  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int}.{core::num::+}(t){(core::num) → core::num};
 }
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
-static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
+static method _extension#0|get#genericMethod(lowered final self::Class1 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#0|genericMethod<T>(#this, t);
+static method _extension#0|get#property(lowered final self::Class1 #this) → core::int {
   core::print("Extension1.property get on ${#this}");
-  return #this.{self::Class1::field}{core::int*};
+  return #this.{self::Class1::field}{core::int};
 }
-static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void {
+static method _extension#0|set#property(lowered final self::Class1 #this, core::int value) → void {
   #this.{self::Class1::field} = value;
   core::print("Extension1.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
 }
-static method _extension#1|method(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|method(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.method on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(3){(core::num) → core::int};
 }
-static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
-  return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
-  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method _extension#1|get#method(lowered final self::Class2 #this) → () → core::int
+  return () → core::int => self::_extension#1|method(#this);
+static method _extension#1|genericMethod<T extends core::num>(lowered final self::Class2 #this, self::_extension#1|genericMethod::T t) → core::num {
+  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(t){(core::num) → core::num}.{core::num::+}(4){(core::num) → core::num};
 }
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
-  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
-static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
+static method _extension#1|get#genericMethod(lowered final self::Class2 #this) → <T extends core::num>(T) → core::num
+  return <T extends core::num>(T t) → core::num => self::_extension#1|genericMethod<T>(#this, t);
+static method _extension#1|get#property(lowered final self::Class2 #this) → core::int {
   core::print("Extension2.property get on ${#this}");
-  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+  return #this.{self::Class2::field}{core::int}.{core::num::+}(5){(core::num) → core::int};
 }
-static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void {
+static method _extension#1|set#property(lowered final self::Class2 #this, core::int value) → void {
   core::print("Extension2.property set(${value}) on ${#this}");
-  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  value = value.{core::num::+}(1){(core::num) → core::int};
   #this.{self::Class2::field} = value;
 }
 static method main() → dynamic {
-  self::testExtension1();
-  self::testExtension2();
+  self::Class1 c10 = new self::Class1::•(0);
+  self::Class1 c11 = new self::Class1::•(1);
+  self::testExtension1(c10, c11, c10, c11);
+  self::Class2 c20 = new self::Class2::•(0);
+  self::Class2 c21 = new self::Class2::•(1);
+  self::testExtension2(c20, c21, c20);
 }
-static method testExtension1() → dynamic {
-  self::Class1* c0 = new self::Class1::•(0);
-  self::Class1* c1 = new self::Class1::•(1);
+static method testExtension1(self::Class1 c0, self::Class1 c1, self::Class1? c0n, self::Class1? c1n) → dynamic {
   self::expect(0, self::_extension#0|method(c0));
   self::expect(1, self::_extension#0|method(c1));
-  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::_extension#0|method(#t1));
-  self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
-  self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
-  self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
-  self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
+  self::expect(1, let final self::Class1? #t1 = c1n in #t1 == null ?{core::int?} null : self::_extension#0|method(#t1{self::Class1}));
+  self::expect(42, self::_extension#0|genericMethod<core::int>(c0, 42));
+  self::expect(43, self::_extension#0|genericMethod<core::num>(c0, 43));
+  self::expect(88, self::_extension#0|genericMethod<core::int>(c1, 87));
+  self::expect(89, self::_extension#0|genericMethod<core::num>(c1, 88));
   self::expect(0, self::_extension#0|get#property(c0));
-  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::_extension#0|get#property(#t2));
-  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
+  self::expect(0, let final self::Class1? #t2 = c0n in #t2 == null ?{core::int?} null : self::_extension#0|get#property(#t2{self::Class1}));
+  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
   self::expect(1, self::_extension#0|get#property(c1));
-  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
-  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
-  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
-  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
-  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
+  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int #t7 = let final core::int #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int #t11 = let final core::int #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int #t15 = let final core::int #t16 = let final core::int #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int #t21 = let final core::int #t22 = let final core::int #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
 }
-static method testExtension2() → dynamic {
-  self::Class2* c0 = new self::Class2::•(0);
-  self::Class2* c1 = new self::Class2::•(1);
+static method testExtension2(self::Class2 c0, self::Class2 c1, self::Class2? c0n) → dynamic {
   self::expect(3, self::_extension#1|method(c0));
-  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::_extension#1|method(#t27));
+  self::expect(3, let final self::Class2? #t27 = c0n in #t27 == null ?{core::int?} null : self::_extension#1|method(#t27{self::Class2}));
   self::expect(4, self::_extension#1|method(c1));
-  self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
-  self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
-  self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
-  self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
+  self::expect(46, self::_extension#1|genericMethod<core::int>(c0, 42));
+  self::expect(47, self::_extension#1|genericMethod<core::num>(c0, 43));
+  self::expect(92, self::_extension#1|genericMethod<core::int>(c1, 87));
+  self::expect(93, self::_extension#1|genericMethod<core::num>(c1, 88));
   self::expect(5, self::_extension#1|get#property(c0));
-  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::_extension#1|get#property(#t28));
-  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
+  self::expect(5, let final self::Class2? #t28 = c0n in #t28 == null ?{core::int?} null : self::_extension#1|get#property(#t28{self::Class2}));
+  self::expect(42, let final core::int #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
   self::expect(48, self::_extension#1|get#property(c0));
   self::expect(6, self::_extension#1|get#property(c1));
-  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
+  self::expect(43, let final core::int #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
   self::expect(49, self::_extension#1|get#property(c1));
-  self::expect(49, let final core::int* #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
-  self::expect(55, let final core::int* #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
-  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
-  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
+  self::expect(49, let final core::int #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int #t37 = let final core::int #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int #t41 = let final core::int #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
-  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
 
 
 Extra constant evaluation status:
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:79:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:79:28 -> IntConstant(42)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(87)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:82:42 -> IntConstant(27)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:82:42 -> IntConstant(27)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:42 -> IntConstant(37)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:42 -> IntConstant(37)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:56 -> IntConstant(77)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:56 -> IntConstant(77)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:56 -> IntConstant(67)
-Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:86:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:86:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:87:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:87:56 -> IntConstant(67)
 Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:100:28 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:100:28 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
 Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
-Extra constant evaluation: evaluated: 325, effectively constant: 16
+Extra constant evaluation: evaluated: 330, effectively constant: 16
diff --git a/pkg/front_end/testcases/extensions/use_this.dart b/pkg/front_end/testcases/extensions/use_this.dart
index 8a23cb9..89105d8 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart
+++ b/pkg/front_end/testcases/extensions/use_this.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 class A1 {}
 
 extension A2 on A1 {
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/use_this.dart.textual_outline.expect
index 9cf7a3b..f12590a 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.textual_outline.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A1 {}
 
 extension A2 on A1 {
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/use_this.dart.textual_outline_modelled.expect
index d1ae3f2..f79fb58 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.textual_outline_modelled.expect
@@ -1,4 +1,3 @@
-// @dart = 2.9
 class A1 {}
 
 class B1<T> {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.weak.expect b/pkg/front_end/testcases/extensions/use_this.dart.weak.expect
index f7ce7a4..b415f82 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.weak.expect
@@ -1,69 +1,49 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect
index f7ce7a4..b415f82 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect
@@ -1,69 +1,49 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/use_this.dart.weak.outline.expect
index f40c736..07b6cee 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.weak.outline.expect
@@ -1,62 +1,42 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1*
+static method A2|method1(lowered final self::A1 #this) → self::A1
   ;
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1*
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1
   ;
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>*
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%>
   ;
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>*
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%>
   ;
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/use_this.dart.weak.transformed.expect
index f7ce7a4..b415f82 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.weak.transformed.expect
@@ -1,69 +1,49 @@
-library;
+library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
 
 class A1 extends core::Object {
-  synthetic constructor •() → self::A1*
+  synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B1<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B1<self::B1::T*>*
+class B1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T%>
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension A2 on self::A1* {
+extension A2 on self::A1 {
   method method1 = self::A2|method1;
   tearoff method1 = self::A2|get#method1;
   method method2 = self::A2|method2;
   tearoff method2 = self::A2|get#method2;
 }
-extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+extension B2<T extends core::Object? = dynamic> on self::B1<T%> {
   method method1 = self::B2|method1;
   tearoff method1 = self::B2|get#method1;
   method method2 = self::B2|method2;
   tearoff method2 = self::B2|get#method2;
 }
-static method A2|method1(lowered final self::A1* #this) → self::A1* {
+static method A2|method1(lowered final self::A1 #this) → self::A1 {
   return #this;
 }
-static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
-  return () → self::A1* => self::A2|method1(#this);
-static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+static method A2|get#method1(lowered final self::A1 #this) → () → self::A1
+  return () → self::A1 => self::A2|method1(#this);
+static method A2|method2<T extends core::Object? = dynamic>(lowered final self::A1 #this, self::A2|method2::T% o) → self::A1 {
   core::print(o);
   return #this;
 }
-static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
-  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
-static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+static method A2|get#method2(lowered final self::A1 #this) → <T extends core::Object? = dynamic>(T%) → self::A1
+  return <T extends core::Object? = dynamic>(T% o) → self::A1 => self::A2|method2<T%>(#this, o);
+static method B2|method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|method1::T%> #this) → self::B1<self::B2|method1::T%> {
   return #this;
 }
-static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
-  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
-static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+static method B2|get#method1<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method1::T%> #this) → () → self::B1<self::B2|get#method1::T%>
+  return () → self::B1<self::B2|get#method1::T%> => self::B2|method1<self::B2|get#method1::T%>(#this);
+static method B2|method2<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::B1<self::B2|method2::T%> #this, self::B2|method2::S% o) → self::B1<self::B2|method2::T%> {
   core::print(o);
   return #this;
 }
-static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
-  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method B2|get#method2<T extends core::Object? = dynamic>(lowered final self::B1<self::B2|get#method2::T%> #this) → <S extends core::Object? = dynamic>(S%) → self::B1<self::B2|get#method2::T%>
+  return <S extends core::Object? = dynamic>(S% o) → self::B1<self::B2|get#method2::T%> => self::B2|method2<self::B2|get#method2::T%, S%>(#this, o);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 4d3af5e..cf5467d 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -13,6 +13,27 @@
 dart2js/late_statics: SemiFuzzFailure
 static_field_lowering/opt_in: SemiFuzzFailure
 
+const_functions/const_functions_list: SemiFuzzCrash
+generic_metadata/typedef_generic_types_in_arguments_and_bounds: SemiFuzzCrash
+
+# These tests have "privacy issues" and isn't compatiable with splitting files (fuzzing):
+constructor_tearoffs/lowering/typedef_from: semiFuzzFailureOnForceRebuildBodies # parts not supported
+dart2js/mixin_default_values/main: semiFuzzFailureOnForceRebuildBodies # private method
+dartdevc/factory_patch/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+dartdevc/private_covariant: semiFuzzFailureOnForceRebuildBodies # private method in class
+late_lowering/injected_late_field_checks/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+late_lowering/issue41436/issue41436: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+late_lowering/issue41922: semiFuzzFailureOnForceRebuildBodies # private field
+late_lowering/private_members: semiFuzzFailureOnForceRebuildBodies # parts not supported
+macros/inject_constructor: semiFuzzFailureOnForceRebuildBodies # Macro injection --- think it might introduce a class in a file?
+nnbd/injected_late_field_checks/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+nnbd/issue42504: semiFuzzFailureOnForceRebuildBodies # private class
+nnbd/issue43918: semiFuzzFailureOnForceRebuildBodies # private class
+nnbd/issue44595: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+nnbd/nullable_extension: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+nnbd/nullable_setter: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+none/mixin_super: semiFuzzFailureOnForceRebuildBodies # has private name mixin
+
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 enhanced_enums/declared_hashcode: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index e28929c..def324c 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -4,6 +4,12 @@
 
 # Status file for the weak_suite.dart test suite.
 
+const_functions/const_functions_list: SemiFuzzCrash
+generic_metadata/typedef_generic_types_in_arguments_and_bounds: SemiFuzzCrash
+nnbd_mixed/mixed_mixin: SemiFuzzFailure
+no_such_method_forwarders/abstract_override_abstract_different_type: SemiFuzzFailure
+no_such_method_forwarders/abstract_override_with_different_signature: SemiFuzzFailure
+
 dart2js/flutter_issue94561/main: SemiFuzzFailure
 dart2js/flutter_issue94561/main.no_link: SemiFuzzFailure
 dart2js/late_fields: SemiFuzzFailure
@@ -21,6 +27,55 @@
 regress/utf_16_le_content.crash: SemiFuzzCrash
 static_field_lowering/opt_in: SemiFuzzFailure
 
+# These tests have "privacy issues" and isn't compatiable with splitting files (fuzzing):
+constructor_tearoffs/lowering/typedef_from: semiFuzzFailureOnForceRebuildBodies # parts not supported
+dart2js/mixin_default_values/main: semiFuzzFailureOnForceRebuildBodies # private method
+dartdevc/factory_patch/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+dartdevc/private_covariant: semiFuzzFailureOnForceRebuildBodies # private method in class
+extensions/internal_resolution: semiFuzzFailureOnForceRebuildBodies # unnamed extensions
+extensions/issue40816: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+extensions/on_function_type: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+extensions/unnamed_extensions: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+general/bug33099: semiFuzzFailureOnForceRebuildBodies # private class
+general/closure: semiFuzzFailureOnForceRebuildBodies # private field
+general/constants/rudimentary_test_01: semiFuzzFailureOnForceRebuildBodies # private method
+general/constants/with_unevaluated_agnostic/rudimentary_test_01: semiFuzzFailureOnForceRebuildBodies # private method
+general/constructor_const_inference: semiFuzzFailureOnForceRebuildBodies # private class
+general/constructor_patch/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+general/issue31767: semiFuzzFailureOnForceRebuildBodies # private class, field
+general/issue45101/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+general/issue47036: semiFuzzFailureOnForceRebuildBodies # private class
+general/issue48548: semiFuzzFailureOnForceRebuildBodies # private field
+general/nested_lib_spec/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+general/part_as_entry_point: semiFuzzFailureOnForceRebuildBodies # parts not supported
+general/private_members: semiFuzzFailureOnForceRebuildBodies # parts not supported
+general/private_method_tearoff: semiFuzzFailureOnForceRebuildBodies # private method in class
+general/redirecting_factory_const_inference: semiFuzzFailureOnForceRebuildBodies # private class
+general/redirecting_factory_invocation_metadata: semiFuzzFailureOnForceRebuildBodies # parts not supported
+general/store_load: semiFuzzFailureOnForceRebuildBodies # private field in class
+general/top_level_accessors: semiFuzzFailureOnForceRebuildBodies # parts not supported
+general/typedef: semiFuzzFailureOnForceRebuildBodies # private typedef
+inference/downwards_inference_on_list_literals_infer_if_value_types_match_context: semiFuzzFailureOnForceRebuildBodies # private field
+late_lowering/injected_late_field_checks/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+
+late_lowering/issue41436/issue41436: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+late_lowering/issue41922: semiFuzzFailureOnForceRebuildBodies # private field
+late_lowering/private_members: semiFuzzFailureOnForceRebuildBodies # parts not supported
+macros/inject_constructor: semiFuzzFailureOnForceRebuildBodies # Macro injection --- think it might introduce a class in a file?
+nnbd_mixed/issue46518: semiFuzzFailureOnForceRebuildBodies # private method
+nnbd_mixed/no_null_shorting_explicit_extension: semiFuzzFailureOnForceRebuildBodies # private field in class
+nnbd_mixed/no_null_shorting_extension: semiFuzzFailureOnForceRebuildBodies # private field in class
+nnbd_mixed/nullable_extension_on_opt_out: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+nnbd_mixed/object_bound_redirecting_factory/main: semiFuzzFailureOnForceRebuildBodies # private constructor
+nnbd/injected_late_field_checks/main: semiFuzzFailureOnForceRebuildBodies # needs custom libraries.json (and platform?) not setup here
+nnbd/issue42504: semiFuzzFailureOnForceRebuildBodies # private class
+nnbd/issue43918: semiFuzzFailureOnForceRebuildBodies # private class
+nnbd/issue44595: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+nnbd/nullable_extension: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+nnbd/nullable_setter: semiFuzzFailureOnForceRebuildBodies # unnamed extension
+none/mixin_super: semiFuzzFailureOnForceRebuildBodies # has private name mixin
+regress/issue_39682: semiFuzzFailureOnForceRebuildBodies # has private method
+
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 enhanced_enums/declared_hashcode: TypeCheckError
diff --git a/tools/VERSION b/tools/VERSION
index 2441773..d7ac1d5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 0
+PRERELEASE 1
 PRERELEASE_PATCH 0
\ No newline at end of file
