[cfe] Implement desugaring of ObjectPattern for simple cases

This CL doesn't cover, among other, the following

* Non-class identifiers
* Some erroneous cases

Part of https://github.com/dart-lang/sdk/issues/49749

Change-Id: I9c6aa9194c09cc2b10b438892b26a01c260e1baf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/275923
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 450d672..a6f9f97 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -12085,6 +12085,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeUnspecifiedGetterNameInObjectPattern =
+    messageUnspecifiedGetterNameInObjectPattern;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageUnspecifiedGetterNameInObjectPattern = const MessageCode(
+    "UnspecifiedGetterNameInObjectPattern",
+    analyzerCodes: <String>["MISSING_OBJECT_PATTERN_GETTER_NAME"],
+    problemMessage:
+        r"""The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeUnsupportedDartExt = messageUnsupportedDartExt;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index bcbc621..8b6d000 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -8328,11 +8328,16 @@
             count)));
     reportIfNotEnabled(
         libraryFeatures.patterns, beginToken.charOffset, beginToken.charCount);
+    List<NamedPattern>? fields;
     for (int i = 0; i < count; i++) {
-      pop();
+      Object? field = pop();
+      if (field is NamedPattern) {
+        (fields ??= <NamedPattern>[]).add(field);
+      } else {
+        // TODO(cstefantsova): Report an error.
+      }
     }
-    // TODO(johnniwinther): Push (named) patterns.
-    push(count != 0 ? <Pattern>[] : NullValue.PatternList);
+    push(fields ?? NullValue.PatternList);
   }
 
   @override
@@ -8347,13 +8352,40 @@
     reportIfNotEnabled(libraryFeatures.patterns, firstIdentifier.charOffset,
         firstIdentifier.charCount);
 
-    // ignore: unused_local_variable
-    List<Pattern>? fields = pop() as List<Pattern>?;
-    // ignore: unused_local_variable
+    List<NamedPattern>? fields = pop() as List<NamedPattern>?;
     List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
 
-    // TODO(johnniwinther): Create object pattern.
-    push(new DummyPattern(firstIdentifier.charOffset));
+    // TODO(cstefantsova): Handle the case of secondIdentifier != null
+    handleIdentifier(firstIdentifier, IdentifierContext.typeReference);
+    Object? resolvedIdentifier = pop();
+    if (resolvedIdentifier is TypeUseGenerator) {
+      TypeDeclarationBuilder typeDeclaration = resolvedIdentifier.declaration;
+      if (typeDeclaration is ClassBuilder) {
+        List<DartType>? builtTypeArguments;
+        if (typeArguments != null) {
+          if (typeArguments.length ==
+              typeDeclaration.cls.typeParameters.length) {
+            for (TypeBuilder typeBuilder in typeArguments) {
+              (builtTypeArguments ??= <DartType>[])
+                  .add(typeBuilder.build(libraryBuilder, TypeUse.typeArgument));
+            }
+          } else {
+            // TODO(cstefantsova): Report an error.
+          }
+        }
+        push(new ObjectPattern(
+            typeDeclaration.cls.reference,
+            fields ?? <NamedPattern>[],
+            builtTypeArguments,
+            firstIdentifier.offset));
+      } else {
+        // TODO(cstefantsova): Handle this case.
+        push(new DummyPattern(firstIdentifier.charOffset));
+      }
+    } else {
+      // TODO(cstefantsova): Handle the error.
+      push(new DummyPattern(firstIdentifier.charOffset));
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 6c00e6c..b1e4454 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -19,6 +19,7 @@
 /// with the same kind of root node.
 import 'package:kernel/ast.dart';
 import 'package:kernel/clone.dart';
+import 'package:kernel/src/bounds_checks.dart';
 import 'package:kernel/src/printer.dart';
 import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
 import 'package:kernel/type_environment.dart';
@@ -3947,8 +3948,14 @@
     };
     List<VariableDeclaration> declaredVariables = this.declaredVariables;
     for (VariableDeclaration variable in declaredVariables) {
-      VariableDeclaration leftVariable = leftVariablesByName[variable.name!]!;
-      VariableDeclaration rightVariable = rightVariablesByName[variable.name!]!;
+      VariableDeclaration? leftVariable = leftVariablesByName[variable.name!];
+      VariableDeclaration? rightVariable = rightVariablesByName[variable.name!];
+
+      if (leftVariable == null || rightVariable == null) {
+        // TODO(cstefantsova): Make sure an error is reported.
+        continue;
+      }
+
       variable.initializer = inferenceVisitor.engine.forest
           .createConditionalExpression(
               fileOffset,
@@ -4535,6 +4542,209 @@
   }
 }
 
+class ObjectPattern extends Pattern {
+  final Reference classReference;
+  final List<NamedPattern> fields;
+  final List<DartType>? typeArguments;
+  Class get classNode => classReference.asClass;
+
+  ObjectPattern(
+      this.classReference, this.fields, this.typeArguments, int fileOffset)
+      : super(fileOffset) {
+    setParents(fields, this);
+  }
+
+  @override
+  PatternInferenceResult acceptInference(InferenceVisitorImpl visitor,
+      {required SharedMatchContext context}) {
+    return visitor.visitObjectPattern(this, context: context);
+  }
+
+  @override
+  List<VariableDeclaration> get declaredVariables {
+    return [for (NamedPattern field in fields) ...field.declaredVariables];
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.write('${classNode.name}');
+    if (typeArguments != null) {
+      printer.write('<');
+      printer.writeTypes(typeArguments!);
+      printer.write('>');
+    }
+    printer.write('(');
+    String comma = '';
+    for (Pattern field in fields) {
+      printer.write(comma);
+      field.toTextInternal(printer);
+      comma = ', ';
+    }
+    printer.write(')');
+  }
+
+  @override
+  String toString() {
+    return "ObjectPattern(${toStringInternal()})";
+  }
+
+  @override
+  PatternTransformationResult transform(
+      Expression matchedExpression,
+      DartType matchedType,
+      Expression variableInitializingContext,
+      InferenceVisitorBase inferenceVisitor) {
+    // targetObjectType: `classNode`<`typeArguments`>
+    DartType targetObjectType;
+    if (typeArguments != null &&
+        typeArguments!.length == classNode.typeParameters.length) {
+      targetObjectType =
+          new InterfaceType(classNode, Nullability.nonNullable, typeArguments);
+    } else {
+      if (typeArguments != null) {
+        // TODO(cstefantsova): Report an error.
+      }
+      targetObjectType = new InterfaceType(
+          classNode,
+          Nullability.nonNullable,
+          calculateBounds(
+              classNode.typeParameters,
+              inferenceVisitor.coreTypes.objectClass,
+              inferenceVisitor.libraryBuilder.library));
+    }
+
+    bool typeCheckForTargetNeeded =
+        !inferenceVisitor.isAssignable(targetObjectType, matchedType) ||
+            matchedType is DynamicType;
+
+    // objectVariable: `matchedType` OVAR = `matchedExpression`
+    VariableDeclaration objectVariable = inferenceVisitor.engine.forest
+        .createVariableDeclarationForValue(matchedExpression,
+            type: matchedType);
+
+    // typeCheck: `objectVariable` is `targetObjectType`
+    //   ==> OVAR is `classNode`<`typeArguments`>
+    Expression? typeCheck;
+    if (typeCheckForTargetNeeded) {
+      typeCheck = inferenceVisitor.engine.forest.createIsExpression(
+          fileOffset,
+          inferenceVisitor.engine.forest
+              .createVariableGet(fileOffset, objectVariable),
+          targetObjectType,
+          forNonNullableByDefault: false);
+    }
+
+    List<VariableDeclaration> elementAccessVariables = [];
+    PatternTransformationResult transformationResult =
+        new PatternTransformationResult([]);
+    for (NamedPattern field in fields) {
+      String? fieldNameString;
+      if (field.name.isNotEmpty) {
+        fieldNameString = field.name;
+      } else {
+        // The name is defined by the nested variable pattern.
+        Pattern nestedPattern = field.pattern;
+        if (nestedPattern is VariablePattern) {
+          fieldNameString = nestedPattern.name;
+        }
+      }
+
+      Expression objectElement;
+      DartType fieldType;
+      if (fieldNameString != null) {
+        Name fieldName = new Name(fieldNameString);
+
+        ObjectAccessTarget fieldAccessTarget = inferenceVisitor
+            .findInterfaceMember(targetObjectType, fieldName, fileOffset,
+                callSiteAccessKind: CallSiteAccessKind.getterInvocation);
+
+        if (fieldAccessTarget.member != null) {
+          fieldType = fieldAccessTarget.getGetterType(inferenceVisitor);
+
+          // objectElement: `objectVariable`.`fieldName`
+          //   ==> OVAR.`fieldName`
+          objectElement = new InstanceGet(
+              InstanceAccessKind.Instance,
+              inferenceVisitor.engine.forest
+                  .createVariableGet(fileOffset, objectVariable)
+                ..promotedType = targetObjectType,
+              fieldName,
+              resultType: fieldType,
+              interfaceTarget: fieldAccessTarget.member!)
+            ..fileOffset = fileOffset;
+        } else {
+          objectElement = inferenceVisitor.helper.buildProblem(
+              templateUndefinedGetter.withArguments(fieldNameString,
+                  targetObjectType, inferenceVisitor.isNonNullableByDefault),
+              fileOffset,
+              noLength);
+          fieldType = const InvalidType();
+        }
+      } else {
+        objectElement = inferenceVisitor.helper.buildProblem(
+            messageUnspecifiedGetterNameInObjectPattern, fileOffset, noLength);
+        fieldType = const InvalidType();
+      }
+
+      // objectElementVariable: `fieldType` EVAR = `objectElement`
+      //   ==> `fieldType` EVAR = OVAR.`fieldName`
+      VariableDeclaration objectElementVariable = inferenceVisitor.engine.forest
+          .createVariableDeclarationForValue(objectElement, type: fieldType);
+
+      PatternTransformationResult subpatternTransformationResult = field.pattern
+          .transform(
+              inferenceVisitor.engine.forest
+                  .createVariableGet(fileOffset, objectElementVariable),
+              fieldType,
+              inferenceVisitor.engine.forest
+                  .createVariableGet(fileOffset, objectElementVariable),
+              inferenceVisitor);
+
+      // If the sub-pattern transformation doesn't declare captured variables
+      // and consists of a single empty element, it means that it simply
+      // doesn't have a place where it could refer to the element expression.
+      // In that case we can avoid creating the intermediary variable for the
+      // element expression.
+      //
+      // An example of such sub-pattern is in the following:
+      //
+      // if (x case A(foo: var _) { /* ... */ }
+      if (field.declaredVariables.isNotEmpty ||
+          !(subpatternTransformationResult.elements.length == 1 &&
+              subpatternTransformationResult.elements.single.isEmpty)) {
+        elementAccessVariables.add(objectElementVariable);
+        transformationResult = transformationResult.combine(
+            subpatternTransformationResult, inferenceVisitor);
+      }
+    }
+
+    transformationResult = transformationResult.prependElement(
+        new PatternTransformationElement(
+            kind: PatternTransformationElementKind.regular,
+            condition: null,
+            variableInitializers: elementAccessVariables),
+        inferenceVisitor);
+
+    if (typeCheck != null) {
+      transformationResult = transformationResult.prependElement(
+          new PatternTransformationElement(
+              kind: PatternTransformationElementKind.regular,
+              condition: typeCheck,
+              variableInitializers: []),
+          inferenceVisitor);
+    }
+
+    transformationResult = transformationResult.prependElement(
+        new PatternTransformationElement(
+            kind: PatternTransformationElementKind.regular,
+            condition: null,
+            variableInitializers: [objectVariable]),
+        inferenceVisitor);
+
+    return transformationResult;
+  }
+}
+
 enum RelationalPatternKind {
   equals,
   notEquals,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
index 80777df..1b12608 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
@@ -9120,6 +9120,17 @@
     return const PatternInferenceResult();
   }
 
+  PatternInferenceResult visitObjectPattern(ObjectPattern pattern,
+      {required SharedMatchContext context}) {
+    analyzeObjectPattern(context, pattern,
+        fields: <RecordPatternField<Node, Pattern>>[
+          for (NamedPattern field in pattern.fields)
+            new RecordPatternField(
+                node: field, name: field.name, pattern: field.pattern)
+        ]);
+    return const PatternInferenceResult();
+  }
+
   PatternInferenceResult visitRelationalPattern(
     RelationalPattern pattern, {
     required SharedMatchContext context,
@@ -9208,8 +9219,27 @@
     required DartType matchedType,
     required Pattern pattern,
   }) {
-    // TODO(scheglov): implement downwardInferObjectPatternRequiredType
-    throw new UnimplementedError('TODO(scheglov)');
+    if (pattern is! ObjectPattern) return const InvalidType();
+    if (pattern.classNode.typeParameters.isEmpty) {
+      return new InterfaceType(pattern.classNode, Nullability.nonNullable, []);
+    }
+    if (pattern.typeArguments != null) {
+      return new InterfaceType(
+          pattern.classNode, Nullability.nonNullable, pattern.typeArguments);
+    }
+
+    DartType typeToInfer =
+        pattern.classNode.getThisType(coreTypes, Nullability.nonNullable);
+    List<TypeParameter> typeParametersToInfer =
+        pattern.classNode.typeParameters;
+    TypeConstraintGatherer gatherer =
+        typeSchemaEnvironment.setupGenericTypeInference(typeToInfer,
+            typeParametersToInfer, matchedType, libraryBuilder.library);
+    List<DartType> inferredTypes = typeSchemaEnvironment.partialInfer(
+        gatherer, typeParametersToInfer, null, libraryBuilder.library);
+    Substitution substitution =
+        Substitution.fromPairs(typeParametersToInfer, inferredTypes);
+    return substitution.substituteType(typeToInfer);
   }
 
   @override
@@ -9223,8 +9253,11 @@
     required DartType receiverType,
     required shared.RecordPatternField<Node, Pattern> field,
   }) {
-    // TODO(scheglov): implement resolveObjectPatternPropertyGet
-    throw new UnimplementedError('TODO(scheglov)');
+    // TODO(cstefantsova): Provide a better fileOffset.
+    ObjectAccessTarget fieldAccessTarget = findInterfaceMember(
+        receiverType, new Name(field.name!), field.pattern.fileOffset,
+        callSiteAccessKind: CallSiteAccessKind.getterInvocation);
+    return fieldAccessTarget.getGetterType(this);
   }
 
   @override
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 612328a..9de3f71 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -6025,3 +6025,12 @@
   script: |
     class A {}
     class B with A {}
+
+UnspecifiedGetterNameInObjectPattern:
+  problemMessage: "The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern."
+  experiments: patterns
+  analyzerCode: MISSING_OBJECT_PATTERN_GETTER_NAME
+  script: |
+    abstract class A { int get foo;}
+    test(dynamic x) { if (x case A(: 0)) {} }
+
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 0923cb0..d622c87 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -967,6 +967,7 @@
 outlined
 outputs
 outputting
+ovar
 overlap
 overlapping
 overlaps
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.expect
index 6912e67..1bc58fa 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5 as{ForNonNullableByDefault} core::int;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.transformed.expect
index 6912e67..ef2da50 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.strong.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = let core::int? #t7 = #t5 in #t7 == null ?{core::int} #t7 as{ForNonNullableByDefault} core::int : #t7{core::int};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.expect
index 6912e67..1bc58fa 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5 as{ForNonNullableByDefault} core::int;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.modular.expect
index 6912e67..1bc58fa 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.modular.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5 as{ForNonNullableByDefault} core::int;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.transformed.expect
index 6912e67..0677822 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern.dart.weak.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.expect
index 6912e67..ad00615 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f as int):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f as int):
+         ^";
+        final core::int #t7 = #t6 as{ForNonNullableByDefault} core::int;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int f = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
index 6912e67..da3fd91 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f as int):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f as int):
+         ^";
+        final core::int #t7 = #t6;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int f = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.expect
index 6912e67..ad00615 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f as int):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f as int):
+         ^";
+        final core::int #t7 = #t6 as{ForNonNullableByDefault} core::int;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int f = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
index 6912e67..ad00615 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f as int):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f as int):
+         ^";
+        final core::int #t7 = #t6 as{ForNonNullableByDefault} core::int;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int f = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
index 6912e67..da3fd91 100644
--- a/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f as int):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/cast_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f as int):
+         ^";
+        final core::int #t7 = #t6;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int f = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.expect
index beb075d..46e34b9 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final core::Object #t4 = #t1 as{ForNonNullableByDefault} core::Object;
-      #t2 = 0;
-      #t3 = true;
+      final core::Object #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.transformed.expect
index 83fce0c..fd41ef4 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.strong.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final core::Object #t4 = let dynamic #t5 = #t1 in #t5 == null ?{core::Object} #t5 as{ForNonNullableByDefault} core::Object : #t5{core::Object};
-      #t2 = 0;
-      #t3 = true;
+      final core::Object #t6 = #t4;
+      if(#t6 is self::C) {
+        final core::int? #t7 = #t6{self::C}.{self::C::f}{core::int?};
+        if(#t7 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.expect
index beb075d..46e34b9 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final core::Object #t4 = #t1 as{ForNonNullableByDefault} core::Object;
-      #t2 = 0;
-      #t3 = true;
+      final core::Object #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.modular.expect
index beb075d..46e34b9 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.modular.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final core::Object #t4 = #t1 as{ForNonNullableByDefault} core::Object;
-      #t2 = 0;
-      #t3 = true;
+      final core::Object #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.transformed.expect
index ebb559d..9470566 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_cast.dart.weak.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final core::Object #t4 = #t1;
-      #t2 = 0;
-      #t3 = true;
+      final core::Object #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.expect
index 495be0b..c2b57fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.transformed.expect
index 495be0b..c2b57fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.strong.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.expect
index 495be0b..c2b57fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.modular.expect
index 495be0b..c2b57fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.modular.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.transformed.expect
index 495be0b..c2b57fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_assert.dart.weak.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.expect
index d6642af..22459c1 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.expect
@@ -17,8 +17,14 @@
     if(!#t3) {
       final dynamic #t4 = #t1;
       if(!(#t4 == null)) {
-        #t2 = 0;
-        #t3 = true;
+        final dynamic #t5 = #t4;
+        if(#t5 is self::C) {
+          final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+          if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+            #t2 = 0;
+            #t3 = true;
+          }
+        }
       }
     }
     switch(#t2) {
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.transformed.expect
index d6642af..22459c1 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.strong.transformed.expect
@@ -17,8 +17,14 @@
     if(!#t3) {
       final dynamic #t4 = #t1;
       if(!(#t4 == null)) {
-        #t2 = 0;
-        #t3 = true;
+        final dynamic #t5 = #t4;
+        if(#t5 is self::C) {
+          final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+          if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+            #t2 = 0;
+            #t3 = true;
+          }
+        }
       }
     }
     switch(#t2) {
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.expect
index d6642af..22459c1 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.expect
@@ -17,8 +17,14 @@
     if(!#t3) {
       final dynamic #t4 = #t1;
       if(!(#t4 == null)) {
-        #t2 = 0;
-        #t3 = true;
+        final dynamic #t5 = #t4;
+        if(#t5 is self::C) {
+          final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+          if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+            #t2 = 0;
+            #t3 = true;
+          }
+        }
       }
     }
     switch(#t2) {
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.modular.expect
index d6642af..22459c1 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.modular.expect
@@ -17,8 +17,14 @@
     if(!#t3) {
       final dynamic #t4 = #t1;
       if(!(#t4 == null)) {
-        #t2 = 0;
-        #t3 = true;
+        final dynamic #t5 = #t4;
+        if(#t5 is self::C) {
+          final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+          if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+            #t2 = 0;
+            #t3 = true;
+          }
+        }
       }
     }
     switch(#t2) {
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.transformed.expect
index d6642af..22459c1 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_inside_null_check.dart.weak.transformed.expect
@@ -17,8 +17,14 @@
     if(!#t3) {
       final dynamic #t4 = #t1;
       if(!(#t4 == null)) {
-        #t2 = 0;
-        #t3 = true;
+        final dynamic #t5 = #t4;
+        if(#t5 is self::C) {
+          final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+          if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+            #t2 = 0;
+            #t3 = true;
+          }
+        }
       }
     }
     switch(#t2) {
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.expect
index 39f9cec..65fe1fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.expect
@@ -14,8 +14,11 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C<core::int>) {
+        #t2 = 0;
+        #t3 = true;
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.transformed.expect
index 39f9cec..65fe1fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.strong.transformed.expect
@@ -14,8 +14,11 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C<core::int>) {
+        #t2 = 0;
+        #t3 = true;
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.expect
index 39f9cec..65fe1fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.expect
@@ -14,8 +14,11 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C<core::int>) {
+        #t2 = 0;
+        #t3 = true;
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.modular.expect
index 39f9cec..65fe1fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.modular.expect
@@ -14,8 +14,11 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C<core::int>) {
+        #t2 = 0;
+        #t3 = true;
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.transformed.expect
index 39f9cec..65fe1fd 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args.dart.weak.transformed.expect
@@ -14,8 +14,11 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C<core::int>) {
+        #t2 = 0;
+        #t3 = true;
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.expect
index 6b4f56b..f5d5f1d 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C<core::int>) {
+        final core::int? #t6 = #t5{self::C<core::int>}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.transformed.expect
index 6b4f56b..f5d5f1d 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.strong.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C<core::int>) {
+        final core::int? #t6 = #t5{self::C<core::int>}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.expect
index 6b4f56b..f5d5f1d 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C<core::int>) {
+        final core::int? #t6 = #t5{self::C<core::int>}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.modular.expect
index 6b4f56b..f5d5f1d 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.modular.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C<core::int>) {
+        final core::int? #t6 = #t5{self::C<core::int>}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.transformed.expect
index 6b4f56b..f5d5f1d 100644
--- a/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/extractor_pattern_with_type_args_inside_null_assert.dart.weak.transformed.expect
@@ -16,8 +16,14 @@
     final core::bool #t3 = false;
     if(!#t3) {
       final dynamic #t4 = #t1!;
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t5 = #t4;
+      if(#t5 is self::C<core::int>) {
+        final core::int? #t6 = #t5{self::C<core::int>}.{self::C::f}{core::int?};
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.expect
index 6912e67..c378da4 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5!;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.transformed.expect
index 6912e67..c378da4 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.strong.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5!;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.expect
index 6912e67..c378da4 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5!;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.modular.expect
index 6912e67..c378da4 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.modular.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5!;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.transformed.expect
index 6912e67..c378da4 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern.dart.weak.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int #t6 = #t5!;
+        if(#t6 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.expect
index 6912e67..d3aa7b5 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f!):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f!):
+         ^";
+        final invalid-type #t7 = #t6!;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
index 6912e67..d3aa7b5 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f!):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f!):
+         ^";
+        final invalid-type #t7 = #t6!;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.expect
index 6912e67..d3aa7b5 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f!):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f!):
+         ^";
+        final invalid-type #t7 = #t6!;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
index 6912e67..d3aa7b5 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f!):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f!):
+         ^";
+        final invalid-type #t7 = #t6!;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
index 6912e67..d3aa7b5 100644
--- a/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f!):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_assert_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f!):
+         ^";
+        final invalid-type #t7 = #t6!;
+        #t3 = 0;
+        #t4 = true;
+        #t1 = #t7;
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.expect
index 6912e67..b25ab7d 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int? #t6 = #t5;
+        if(!(#t6 == null) && #t6{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.transformed.expect
index 6912e67..b25ab7d 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.strong.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int? #t6 = #t5;
+        if(!(#t6 == null) && #t6{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.expect
index 6912e67..b25ab7d 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int? #t6 = #t5;
+        if(!(#t6 == null) && #t6{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.modular.expect
index 6912e67..b25ab7d 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.modular.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int? #t6 = #t5;
+        if(!(#t6 == null) && #t6{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.transformed.expect
index 6912e67..b25ab7d 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern.dart.weak.transformed.expect
@@ -15,8 +15,15 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        final core::int? #t6 = #t5;
+        if(!(#t6 == null) && #t6{core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.expect
index 6912e67..8938743 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f?):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,29 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f?):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(!(#t7 == null)) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7;
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
index 6912e67..8938743 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f?):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,29 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f?):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(!(#t7 == null)) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7;
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.expect
index 6912e67..8938743 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f?):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,29 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f?):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(!(#t7 == null)) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7;
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
index 6912e67..8938743 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f?):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,29 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f?):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(!(#t7 == null)) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7;
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
index 6912e67..8938743 100644
--- a/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
@@ -1,4 +1,11 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+//     case C(: var f?):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +18,29 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/null_check_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
+    case C(: var f?):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(!(#t7 == null)) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7;
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          dynamic f = #t1{dynamic};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.expect b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.expect
index 6912e67..120fd01 100644
--- a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.expect
@@ -15,8 +15,14 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        if(#t5 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.transformed.expect
index 6912e67..120fd01 100644
--- a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.strong.transformed.expect
@@ -15,8 +15,14 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        if(#t5 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.expect b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.expect
index 6912e67..120fd01 100644
--- a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.expect
@@ -15,8 +15,14 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        if(#t5 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.modular.expect
index 6912e67..120fd01 100644
--- a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.modular.expect
@@ -15,8 +15,14 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        if(#t5 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.transformed.expect
index 6912e67..120fd01 100644
--- a/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/relational_inside_extractor_pattern.dart.weak.transformed.expect
@@ -15,8 +15,14 @@
     final core::int #t2 = -1;
     final core::bool #t3 = false;
     if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+      final dynamic #t4 = #t1;
+      if(#t4 is self::C) {
+        final core::int? #t5 = #t4{self::C}.{self::C::f}{core::int?};
+        if(#t5 =={core::num::==}{(core::Object) → core::bool} 1) {
+          #t2 = 0;
+          #t3 = true;
+        }
+      }
     }
     switch(#t2) {
       #L2:
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.expect
index 6912e67..5a07ff0 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.expect
@@ -11,17 +11,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        final core::int? #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.transformed.expect
index 6912e67..5a07ff0 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.strong.transformed.expect
@@ -11,17 +11,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        final core::int? #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.expect
index 6912e67..5a07ff0 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.expect
@@ -11,17 +11,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        final core::int? #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.modular.expect
index 6912e67..5a07ff0 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.modular.expect
@@ -11,17 +11,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        final core::int? #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.transformed.expect
index 6912e67..5a07ff0 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern.dart.weak.transformed.expect
@@ -11,17 +11,27 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final core::int? #t6 = #t5{self::C}.{self::C::f}{core::int?};
+        final core::int? #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.expect
index 6912e67..cfe96d4 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.expect
@@ -1,4 +1,13 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+//     case C(: int as):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +20,31 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+    case C(: int as):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
index 6912e67..cfe96d4 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.strong.transformed.expect
@@ -1,4 +1,13 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+//     case C(: int as):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +20,31 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+    case C(: int as):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.expect
index 6912e67..cfe96d4 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.expect
@@ -1,4 +1,13 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+//     case C(: int as):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +20,31 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+    case C(: int as):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
index 6912e67..cfe96d4 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.modular.expect
@@ -1,4 +1,13 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+//     case C(: int as):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +20,31 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+    case C(: int as):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }
diff --git a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
index 6912e67..cfe96d4 100644
--- a/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart.weak.transformed.expect
@@ -1,4 +1,13 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+//     case C(: int as):
+//          ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,17 +20,31 @@
 static method test(dynamic x) → dynamic {
   #L1:
   {
-    final dynamic #t1 = x;
-    final core::int #t2 = -1;
-    final core::bool #t3 = false;
-    if(!#t3) {
-      #t2 = 0;
-      #t3 = true;
+    dynamic #t1;
+    final dynamic #t2 = x;
+    final core::int #t3 = -1;
+    final core::bool #t4 = false;
+    if(!#t4) {
+      final dynamic #t5 = #t2;
+      if(#t5 is self::C) {
+        final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart:10:10: Error: The getter 'as' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/patterns/typed_variable_named_as_inside_extractor_pattern_implicitly_named.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'as'.
+    case C(: int as):
+         ^";
+        final invalid-type #t7 = #t6;
+        if(#t7 is core::int) {
+          #t3 = 0;
+          #t4 = true;
+          #t1 = #t7{core::int};
+        }
+      }
     }
-    switch(#t2) {
+    switch(#t3) {
       #L2:
       case #C1:
         {
+          core::int as = #t1{core::int};
           {
             break #L1;
           }