[vm, dart2wasm] Early lowering of FunctionTearOff nodes

FunctionTearOff node represents a tear-off of the 'call' method of
a Function, so it is basically a no-op:

  FunctionTearOff(receiver) == receiver

So we can remove this node early, during lowering transformation on
kernel AST and clean up handling of FunctionTearOff nodes from the VM
and dart2wasm compilation pipelines.

TEST=ci

Change-Id: Ia1500a066a0261076162e018ff0ab502258f606f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/325924
Reviewed-by: Ömer Ağacan <omersa@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/dart2wasm/lib/await_transformer.dart b/pkg/dart2wasm/lib/await_transformer.dart
index f0ebf61..3a2c36e 100644
--- a/pkg/dart2wasm/lib/await_transformer.dart
+++ b/pkg/dart2wasm/lib/await_transformer.dart
@@ -844,9 +844,6 @@
   TreeNode visitInstanceTearOff(InstanceTearOff expr) => unary(expr);
 
   @override
-  TreeNode visitFunctionTearOff(FunctionTearOff expr) => unary(expr);
-
-  @override
   TreeNode visitSuperPropertySet(SuperPropertySet expr) => unary(expr);
 
   @override
diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart
index 076618a..c5e563e 100644
--- a/pkg/dart2wasm/lib/code_generator.dart
+++ b/pkg/dart2wasm/lib/code_generator.dart
@@ -2145,11 +2145,6 @@
   }
 
   @override
-  w.ValueType visitFunctionTearOff(
-          FunctionTearOff node, w.ValueType expectedType) =>
-      wrap(node.receiver, expectedType);
-
-  @override
   w.ValueType visitInstanceTearOff(
       InstanceTearOff node, w.ValueType expectedType) {
     Member target = node.interfaceTarget;
diff --git a/pkg/dart2wasm/lib/transformers.dart b/pkg/dart2wasm/lib/transformers.dart
index 04d6bb8..5f3f25c 100644
--- a/pkg/dart2wasm/lib/transformers.dart
+++ b/pkg/dart2wasm/lib/transformers.dart
@@ -710,6 +710,12 @@
     node.transformChildren(this);
     return _listFactorySpecializer.transformStaticInvocation(node);
   }
+
+  @override
+  visitFunctionTearOff(FunctionTearOff node) {
+    node.transformChildren(this);
+    return node.receiver;
+  }
 }
 
 class _AsyncStarFrame {
diff --git a/pkg/front_end/testcases/general/bug21938.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug21938.dart.strong.transformed.expect
index a7594fa..a9fbfdc 100644
--- a/pkg/front_end/testcases/general/bug21938.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug21938.dart.strong.transformed.expect
@@ -40,7 +40,7 @@
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   x.call();
     ^^^^" in x{<unresolved>}.call();
-  f.call;
+  f;
   f(5, 2);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug21938.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug21938.dart.weak.transformed.expect
index a7594fa..a9fbfdc 100644
--- a/pkg/front_end/testcases/general/bug21938.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug21938.dart.weak.transformed.expect
@@ -40,7 +40,7 @@
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   x.call();
     ^^^^" in x{<unresolved>}.call();
-  f.call;
+  f;
   f(5, 2);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/call.dart.strong.transformed.expect
index 45d0ca4..9804a19 100644
--- a/pkg/front_end/testcases/general/call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/call.dart.strong.transformed.expect
@@ -111,13 +111,13 @@
 static field (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
 static field dynamic int1 = self::closure(1){(dynamic) → dynamic};
 static field dynamic int2 = self::closure(1){(dynamic) → dynamic};
-static field dynamic int3 = self::closure.call(1){(dynamic) → dynamic};
-static field dynamic int4 = self::closure.call.call(1){(dynamic) → dynamic};
+static field dynamic int3 = self::closure(1){(dynamic) → dynamic};
+static field dynamic int4 = self::closure(1){(dynamic) → dynamic};
 static field self::Callable callable = new self::Callable::•();
 static field dynamic string1 = self::callable.{self::Callable::call}(1){(dynamic) → dynamic};
 static field dynamic string2 = self::callable.{self::Callable::call}(1){(dynamic) → dynamic};
 static field dynamic string3 = self::callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
-static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) → dynamic}.call(1){(dynamic) → dynamic};
+static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
 static field self::CallableGetter callableGetter = new self::CallableGetter::•();
 static field invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
@@ -135,10 +135,10 @@
                            ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
 var nothing3 = closure.call.call();
-                                ^" in self::closure.call{<inapplicable>}.();
+                                ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
 var nothing4 = closure.call.call.call();
-                                     ^" in self::closure.call.call{<inapplicable>}.();
+                                     ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
 var nothing5 = callable();
                        ^" in self::callable.{self::Callable::call}{<inapplicable>}.(){() → invalid-type};
@@ -150,7 +150,7 @@
                                  ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
 static field invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
 var nothing8 = callable.call.call.call();
-                                      ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}.call{<inapplicable>}.();
+                                      ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
 static field invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -163,13 +163,13 @@
   (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
   dynamic int1 = closure(1){(dynamic) → dynamic};
   dynamic int2 = closure(1){(dynamic) → dynamic};
-  dynamic int3 = closure.call(1){(dynamic) → dynamic};
-  dynamic int4 = closure.call.call(1){(dynamic) → dynamic};
+  dynamic int3 = closure(1){(dynamic) → dynamic};
+  dynamic int4 = closure(1){(dynamic) → dynamic};
   self::Callable callable = new self::Callable::•();
   dynamic string1 = callable.{self::Callable::call}(1){(dynamic) → dynamic};
   dynamic string2 = callable.{self::Callable::call}(1){(dynamic) → dynamic};
   dynamic string3 = callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
-  dynamic string4 = callable.{self::Callable::call}{(dynamic) → dynamic}.call(1){(dynamic) → dynamic};
+  dynamic string4 = callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
   self::CallableGetter callableGetter = new self::CallableGetter::•();
   invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
@@ -187,10 +187,10 @@
                              ^" in closure{<inapplicable>}.();
   invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
   var nothing3 = closure.call.call();
-                                  ^" in closure.call{<inapplicable>}.();
+                                  ^" in closure{<inapplicable>}.();
   invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
   var nothing4 = closure.call.call.call();
-                                       ^" in closure.call.call{<inapplicable>}.();
+                                       ^" in closure{<inapplicable>}.();
   invalid-type nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
   var nothing5 = callable();
                          ^" in callable.{self::Callable::call}{<inapplicable>}.(){() → invalid-type};
@@ -202,7 +202,7 @@
                                    ^" in callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
   invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
   var nothing8 = callable.call.call.call();
-                                        ^" in callable.{self::Callable::call}{(dynamic) → dynamic}.call{<inapplicable>}.();
+                                        ^" in callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
   invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -217,4 +217,4 @@
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///call.dart:30:37 -> IntConstant(1)
 Evaluated: VariableGet @ org-dartlang-testcase:///call.dart:64:35 -> IntConstant(1)
-Extra constant evaluation: evaluated: 101, effectively constant: 2
+Extra constant evaluation: evaluated: 93, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/call.dart.weak.transformed.expect b/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
index 45d0ca4..9804a19 100644
--- a/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
@@ -111,13 +111,13 @@
 static field (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
 static field dynamic int1 = self::closure(1){(dynamic) → dynamic};
 static field dynamic int2 = self::closure(1){(dynamic) → dynamic};
-static field dynamic int3 = self::closure.call(1){(dynamic) → dynamic};
-static field dynamic int4 = self::closure.call.call(1){(dynamic) → dynamic};
+static field dynamic int3 = self::closure(1){(dynamic) → dynamic};
+static field dynamic int4 = self::closure(1){(dynamic) → dynamic};
 static field self::Callable callable = new self::Callable::•();
 static field dynamic string1 = self::callable.{self::Callable::call}(1){(dynamic) → dynamic};
 static field dynamic string2 = self::callable.{self::Callable::call}(1){(dynamic) → dynamic};
 static field dynamic string3 = self::callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
-static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) → dynamic}.call(1){(dynamic) → dynamic};
+static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
 static field self::CallableGetter callableGetter = new self::CallableGetter::•();
 static field invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
@@ -135,10 +135,10 @@
                            ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
 var nothing3 = closure.call.call();
-                                ^" in self::closure.call{<inapplicable>}.();
+                                ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
 var nothing4 = closure.call.call.call();
-                                     ^" in self::closure.call.call{<inapplicable>}.();
+                                     ^" in self::closure{<inapplicable>}.();
 static field invalid-type nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
 var nothing5 = callable();
                        ^" in self::callable.{self::Callable::call}{<inapplicable>}.(){() → invalid-type};
@@ -150,7 +150,7 @@
                                  ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
 static field invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
 var nothing8 = callable.call.call.call();
-                                      ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}.call{<inapplicable>}.();
+                                      ^" in self::callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
 static field invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -163,13 +163,13 @@
   (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
   dynamic int1 = closure(1){(dynamic) → dynamic};
   dynamic int2 = closure(1){(dynamic) → dynamic};
-  dynamic int3 = closure.call(1){(dynamic) → dynamic};
-  dynamic int4 = closure.call.call(1){(dynamic) → dynamic};
+  dynamic int3 = closure(1){(dynamic) → dynamic};
+  dynamic int4 = closure(1){(dynamic) → dynamic};
   self::Callable callable = new self::Callable::•();
   dynamic string1 = callable.{self::Callable::call}(1){(dynamic) → dynamic};
   dynamic string2 = callable.{self::Callable::call}(1){(dynamic) → dynamic};
   dynamic string3 = callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
-  dynamic string4 = callable.{self::Callable::call}{(dynamic) → dynamic}.call(1){(dynamic) → dynamic};
+  dynamic string4 = callable.{self::Callable::call}{(dynamic) → dynamic}(1){(dynamic) → dynamic};
   self::CallableGetter callableGetter = new self::CallableGetter::•();
   invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
@@ -187,10 +187,10 @@
                              ^" in closure{<inapplicable>}.();
   invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
   var nothing3 = closure.call.call();
-                                  ^" in closure.call{<inapplicable>}.();
+                                  ^" in closure{<inapplicable>}.();
   invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
   var nothing4 = closure.call.call.call();
-                                       ^" in closure.call.call{<inapplicable>}.();
+                                       ^" in closure{<inapplicable>}.();
   invalid-type nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
   var nothing5 = callable();
                          ^" in callable.{self::Callable::call}{<inapplicable>}.(){() → invalid-type};
@@ -202,7 +202,7 @@
                                    ^" in callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
   invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
   var nothing8 = callable.call.call.call();
-                                        ^" in callable.{self::Callable::call}{(dynamic) → dynamic}.call{<inapplicable>}.();
+                                        ^" in callable.{self::Callable::call}{(dynamic) → dynamic}{<inapplicable>}.();
   invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
@@ -217,4 +217,4 @@
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///call.dart:30:37 -> IntConstant(1)
 Evaluated: VariableGet @ org-dartlang-testcase:///call.dart:64:35 -> IntConstant(1)
-Extra constant evaluation: evaluated: 101, effectively constant: 2
+Extra constant evaluation: evaluated: 93, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.strong.transformed.expect
index 61b47c3..4fcd99b 100644
--- a/pkg/front_end/testcases/general/callable_type_variable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   method method() → dynamic {
     dynamic v1 = this.{self::Class1::field}{self::Class1::T}();
     dynamic v2 = let final core::int #t1 = 0 in this.{self::Class1::field}{self::Class1::T}(#t1);
-    self::Class1::T v3 = this.{self::Class1::field}{self::Class1::T}.call;
+    self::Class1::T v3 = this.{self::Class1::field}{self::Class1::T};
     dynamic v4 = this.{self::Class1::field}{self::Class1::T}();
     dynamic v5 = this.{self::Class1::field}{self::Class1::T}(0);
   }
@@ -36,7 +36,7 @@
     var v1 = field(); // error
                   ^" in this.{self::Class2::field}{self::Class2::T}{<inapplicable>}.();
     core::String v2 = let final core::int #t2 = 0 in this.{self::Class2::field}{self::Class2::T}(#t2){(core::int) → core::String};
-    self::Class2::T v3 = this.{self::Class2::field}{self::Class2::T}.call;
+    self::Class2::T v3 = this.{self::Class2::field}{self::Class2::T};
     invalid-type v4 = invalid-expression "pkg/front_end/testcases/general/callable_type_variable.dart:28:24: Error: Too few positional arguments: 1 required, 0 given.
     var v4 = field.call(); // error
                        ^" in this.{self::Class2::field}{self::Class2::T}{<inapplicable>}.();
@@ -49,4 +49,4 @@
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///callable_type_variable.dart:12:20 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///callable_type_variable.dart:26:20 -> IntConstant(0)
-Extra constant evaluation: evaluated: 30, effectively constant: 2
+Extra constant evaluation: evaluated: 28, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
index 61b47c3..4fcd99b 100644
--- a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   method method() → dynamic {
     dynamic v1 = this.{self::Class1::field}{self::Class1::T}();
     dynamic v2 = let final core::int #t1 = 0 in this.{self::Class1::field}{self::Class1::T}(#t1);
-    self::Class1::T v3 = this.{self::Class1::field}{self::Class1::T}.call;
+    self::Class1::T v3 = this.{self::Class1::field}{self::Class1::T};
     dynamic v4 = this.{self::Class1::field}{self::Class1::T}();
     dynamic v5 = this.{self::Class1::field}{self::Class1::T}(0);
   }
@@ -36,7 +36,7 @@
     var v1 = field(); // error
                   ^" in this.{self::Class2::field}{self::Class2::T}{<inapplicable>}.();
     core::String v2 = let final core::int #t2 = 0 in this.{self::Class2::field}{self::Class2::T}(#t2){(core::int) → core::String};
-    self::Class2::T v3 = this.{self::Class2::field}{self::Class2::T}.call;
+    self::Class2::T v3 = this.{self::Class2::field}{self::Class2::T};
     invalid-type v4 = invalid-expression "pkg/front_end/testcases/general/callable_type_variable.dart:28:24: Error: Too few positional arguments: 1 required, 0 given.
     var v4 = field.call(); // error
                        ^" in this.{self::Class2::field}{self::Class2::T}{<inapplicable>}.();
@@ -49,4 +49,4 @@
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///callable_type_variable.dart:12:20 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///callable_type_variable.dart:26:20 -> IntConstant(0)
-Extra constant evaluation: evaluated: 30, effectively constant: 2
+Extra constant evaluation: evaluated: 28, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.transformed.expect
index 11ce2fa..db5d68a 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.transformed.expect
@@ -17,6 +17,6 @@
   (core::int*) →* core::int* func;
   func = invalid-expression "pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:12:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
   func = f.call;
-           ^" in f.call as{TypeError,ForLegacy} (core::int*) →* core::int*;
+           ^" in f as{TypeError,ForLegacy} (core::int*) →* core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.transformed.expect
index 74faced..1444f05 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.transformed.expect
@@ -13,6 +13,6 @@
   (core::int*) →* core::int* func;
   func = invalid-expression "pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:12:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
   func = f.call;
-           ^" in f.call as{TypeError,ForLegacy} (core::int*) →* core::int*;
+           ^" in f as{TypeError,ForLegacy} (core::int*) →* core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect
index 415839d..27307af 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.transformed.expect
@@ -507,7 +507,7 @@
  - 'Function' is from 'dart:core'.
 Try accessing using ?. instead.
 var topLevelFunctionTearOff = nullableFunction.call;
-                                               ^^^^" in self::nullableFunction.call;
+                                               ^^^^" in self::nullableFunction;
 static field void topLevelFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
 var topLevelFunctionTypeImplicitCall = nullableFunctionType();
@@ -519,7 +519,7 @@
 static field () →? void topLevelFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
 Try accessing using ?. instead.
 var topLevelFunctionTypeTearOff = nullableFunctionType.call;
-                                                       ^^^^" in self::nullableFunctionType.call;
+                                                       ^^^^" in self::nullableFunctionType;
 static field dynamic topLevelFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
 Try calling using ?.call instead.
@@ -714,7 +714,7 @@
  - 'Function' is from 'dart:core'.
 Try accessing using ?. instead.
   var localFunctionTearOff = nullableFunction.call;
-                                              ^^^^" in self::nullableFunction.call;
+                                              ^^^^" in self::nullableFunction;
   void localFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:89:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
   var localFunctionTypeImplicitCall = nullableFunctionType();
@@ -726,7 +726,7 @@
   () →? void localFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:91:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
 Try accessing using ?. instead.
   var localFunctionTypeTearOff = nullableFunctionType.call;
-                                                      ^^^^" in self::nullableFunctionType.call;
+                                                      ^^^^" in self::nullableFunctionType;
   dynamic localFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:92:42: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
 Try calling using ?.call instead.
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect
index 415839d..27307af 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.transformed.expect
@@ -507,7 +507,7 @@
  - 'Function' is from 'dart:core'.
 Try accessing using ?. instead.
 var topLevelFunctionTearOff = nullableFunction.call;
-                                               ^^^^" in self::nullableFunction.call;
+                                               ^^^^" in self::nullableFunction;
 static field void topLevelFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
 var topLevelFunctionTypeImplicitCall = nullableFunctionType();
@@ -519,7 +519,7 @@
 static field () →? void topLevelFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
 Try accessing using ?. instead.
 var topLevelFunctionTypeTearOff = nullableFunctionType.call;
-                                                       ^^^^" in self::nullableFunctionType.call;
+                                                       ^^^^" in self::nullableFunctionType;
 static field dynamic topLevelFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
 Try calling using ?.call instead.
@@ -714,7 +714,7 @@
  - 'Function' is from 'dart:core'.
 Try accessing using ?. instead.
   var localFunctionTearOff = nullableFunction.call;
-                                              ^^^^" in self::nullableFunction.call;
+                                              ^^^^" in self::nullableFunction;
   void localFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:89:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
   var localFunctionTypeImplicitCall = nullableFunctionType();
@@ -726,7 +726,7 @@
   () →? void localFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:91:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
 Try accessing using ?. instead.
   var localFunctionTypeTearOff = nullableFunctionType.call;
-                                                      ^^^^" in self::nullableFunctionType.call;
+                                                      ^^^^" in self::nullableFunctionType;
   dynamic localFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:92:42: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
 Try calling using ?.call instead.
diff --git a/pkg/front_end/testcases/patterns/pattern_types.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/pattern_types.dart.strong.transformed.expect
index b10a2fe..d39b377 100644
--- a/pkg/front_end/testcases/patterns/pattern_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/pattern_types.dart.strong.transformed.expect
@@ -227,7 +227,7 @@
       lowered core::int $1#case#1;
       lowered core::String named#case#1;
       invalid-type ambiguousField;
-      if(#0#0 is Null && (let final core::int #t1 = hashCode = #0#0{Null}.{core::Object::hashCode}{core::int} in true) || #0#0 is Null && (let final () → core::String #t2 = toString = #0#0{Null}.{core::Object::toString}{() → core::String} in true) || #0#0 is self::Class && (let final dynamic #t3 = field#case#0 = #0#5#isSet ?{dynamic} #0#5{dynamic} : let final core::bool* #t4 = #0#5#isSet = true in #0#5 = #0#0{self::Class}.{self::Class::field}{dynamic} in true) || #0#0 is self::Class && (let final () → void #t5 = method#case#0 = #0#6#isSet ?{() → void} #0#6{() → void} : let final core::bool* #t6 = #0#6#isSet = true in #0#6 = #0#0{self::Class}.{self::Class::method}{() → void} in true) || #0#0 is self::Class && (let final core::int #t7 = extensionGetter#case#0 = self::_extension#0|get#extensionGetter(#0#0{self::Class}) in true) || #0#0 is self::Class && (let final () → void #t8 = extensionMethod#case#0 = self::_extension#0|get#extensionMethod(#0#0{self::Class}) in true) || #0#0 is dynamic && (let final dynamic #t9 = dynamicAccess = #0#0{dynamic}.dynamicAccess in true) || #0#0 is () → void && (let final () → void #t10 = call#case#0 = #0#12#isSet ?{() → void} #0#12{() → void} : let final core::bool* #t11 = #0#12#isSet = true in #0#12 = #0#0{() → void}.call in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::int #t12 = $1#case#0 = #0#14#isSet ?{core::int} #0#14{core::int} : let final core::bool* #t13 = #0#14#isSet = true in #0#14 = #0#0{(core::int, {required named: core::String})}.$1{core::int} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::String #t14 = named#case#0 = #0#15#isSet ?{core::String} #0#15{core::String} : let final core::bool* #t15 = #0#15#isSet = true in #0#15 = #0#0{(core::int, {required named: core::String})}.named{core::String} in true) || #0#0 is self::Class && (let final invalid-type #t16 = invalid-expression "pkg/front_end/testcases/patterns/pattern_types.dart:73:16: Error: The getter 'missing' isn't defined for the class 'Class'.
+      if(#0#0 is Null && (let final core::int #t1 = hashCode = #0#0{Null}.{core::Object::hashCode}{core::int} in true) || #0#0 is Null && (let final () → core::String #t2 = toString = #0#0{Null}.{core::Object::toString}{() → core::String} in true) || #0#0 is self::Class && (let final dynamic #t3 = field#case#0 = #0#5#isSet ?{dynamic} #0#5{dynamic} : let final core::bool* #t4 = #0#5#isSet = true in #0#5 = #0#0{self::Class}.{self::Class::field}{dynamic} in true) || #0#0 is self::Class && (let final () → void #t5 = method#case#0 = #0#6#isSet ?{() → void} #0#6{() → void} : let final core::bool* #t6 = #0#6#isSet = true in #0#6 = #0#0{self::Class}.{self::Class::method}{() → void} in true) || #0#0 is self::Class && (let final core::int #t7 = extensionGetter#case#0 = self::_extension#0|get#extensionGetter(#0#0{self::Class}) in true) || #0#0 is self::Class && (let final () → void #t8 = extensionMethod#case#0 = self::_extension#0|get#extensionMethod(#0#0{self::Class}) in true) || #0#0 is dynamic && (let final dynamic #t9 = dynamicAccess = #0#0{dynamic}.dynamicAccess in true) || #0#0 is () → void && (let final () → void #t10 = call#case#0 = #0#12#isSet ?{() → void} #0#12{() → void} : let final core::bool* #t11 = #0#12#isSet = true in #0#12 = #0#0{() → void} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::int #t12 = $1#case#0 = #0#14#isSet ?{core::int} #0#14{core::int} : let final core::bool* #t13 = #0#14#isSet = true in #0#14 = #0#0{(core::int, {required named: core::String})}.$1{core::int} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::String #t14 = named#case#0 = #0#15#isSet ?{core::String} #0#15{core::String} : let final core::bool* #t15 = #0#15#isSet = true in #0#15 = #0#0{(core::int, {required named: core::String})}.named{core::String} in true) || #0#0 is self::Class && (let final invalid-type #t16 = invalid-expression "pkg/front_end/testcases/patterns/pattern_types.dart:73:16: Error: The getter 'missing' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/patterns/pattern_types.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'missing'.
     case Class(: var missing): // Error: missing getter
diff --git a/pkg/front_end/testcases/patterns/pattern_types.dart.weak.transformed.expect b/pkg/front_end/testcases/patterns/pattern_types.dart.weak.transformed.expect
index 6bf8fdb..80867aa 100644
--- a/pkg/front_end/testcases/patterns/pattern_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/patterns/pattern_types.dart.weak.transformed.expect
@@ -228,7 +228,7 @@
       lowered core::int $1#case#1;
       lowered core::String named#case#1;
       invalid-type ambiguousField;
-      if(#0#0 is Null && (let final core::int #t1 = hashCode = #0#0{Null}.{core::Object::hashCode}{core::int} in true) || #0#0 is Null && (let final () → core::String #t2 = toString = #0#0{Null}.{core::Object::toString}{() → core::String} in true) || #0#0 is self::Class && (let final dynamic #t3 = field#case#0 = #0#5#isSet ?{dynamic} #0#5{dynamic} : let final core::bool* #t4 = #0#5#isSet = true in #0#5 = #0#0{self::Class}.{self::Class::field}{dynamic} in true) || #0#0 is self::Class && (let final () → void #t5 = method#case#0 = #0#6#isSet ?{() → void} #0#6{() → void} : let final core::bool* #t6 = #0#6#isSet = true in #0#6 = #0#0{self::Class}.{self::Class::method}{() → void} in true) || #0#0 is self::Class && (let final core::int #t7 = extensionGetter#case#0 = self::_extension#0|get#extensionGetter(#0#0{self::Class}) in true) || #0#0 is self::Class && (let final () → void #t8 = extensionMethod#case#0 = self::_extension#0|get#extensionMethod(#0#0{self::Class}) in true) || #0#0 is dynamic && (let final dynamic #t9 = dynamicAccess = #0#0{dynamic}.dynamicAccess in true) || #0#0 is () → void && (let final () → void #t10 = call#case#0 = #0#12#isSet ?{() → void} #0#12{() → void} : let final core::bool* #t11 = #0#12#isSet = true in #0#12 = #0#0{() → void}.call in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::int #t12 = $1#case#0 = #0#14#isSet ?{core::int} #0#14{core::int} : let final core::bool* #t13 = #0#14#isSet = true in #0#14 = #0#0{(core::int, {required named: core::String})}.$1{core::int} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::String #t14 = named#case#0 = #0#15#isSet ?{core::String} #0#15{core::String} : let final core::bool* #t15 = #0#15#isSet = true in #0#15 = #0#0{(core::int, {required named: core::String})}.named{core::String} in true) || #0#0 is self::Class && (let final invalid-type #t16 = invalid-expression "pkg/front_end/testcases/patterns/pattern_types.dart:73:16: Error: The getter 'missing' isn't defined for the class 'Class'.
+      if(#0#0 is Null && (let final core::int #t1 = hashCode = #0#0{Null}.{core::Object::hashCode}{core::int} in true) || #0#0 is Null && (let final () → core::String #t2 = toString = #0#0{Null}.{core::Object::toString}{() → core::String} in true) || #0#0 is self::Class && (let final dynamic #t3 = field#case#0 = #0#5#isSet ?{dynamic} #0#5{dynamic} : let final core::bool* #t4 = #0#5#isSet = true in #0#5 = #0#0{self::Class}.{self::Class::field}{dynamic} in true) || #0#0 is self::Class && (let final () → void #t5 = method#case#0 = #0#6#isSet ?{() → void} #0#6{() → void} : let final core::bool* #t6 = #0#6#isSet = true in #0#6 = #0#0{self::Class}.{self::Class::method}{() → void} in true) || #0#0 is self::Class && (let final core::int #t7 = extensionGetter#case#0 = self::_extension#0|get#extensionGetter(#0#0{self::Class}) in true) || #0#0 is self::Class && (let final () → void #t8 = extensionMethod#case#0 = self::_extension#0|get#extensionMethod(#0#0{self::Class}) in true) || #0#0 is dynamic && (let final dynamic #t9 = dynamicAccess = #0#0{dynamic}.dynamicAccess in true) || #0#0 is () → void && (let final () → void #t10 = call#case#0 = #0#12#isSet ?{() → void} #0#12{() → void} : let final core::bool* #t11 = #0#12#isSet = true in #0#12 = #0#0{() → void} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::int #t12 = $1#case#0 = #0#14#isSet ?{core::int} #0#14{core::int} : let final core::bool* #t13 = #0#14#isSet = true in #0#14 = #0#0{(core::int, {required named: core::String})}.$1{core::int} in true) || #0#0 is (core::int, {required named: core::String}) && (let final core::String #t14 = named#case#0 = #0#15#isSet ?{core::String} #0#15{core::String} : let final core::bool* #t15 = #0#15#isSet = true in #0#15 = #0#0{(core::int, {required named: core::String})}.named{core::String} in true) || #0#0 is self::Class && (let final invalid-type #t16 = invalid-expression "pkg/front_end/testcases/patterns/pattern_types.dart:73:16: Error: The getter 'missing' isn't defined for the class 'Class'.
  - 'Class' is from 'pkg/front_end/testcases/patterns/pattern_types.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'missing'.
     case Class(: var missing): // Error: missing getter
diff --git a/pkg/front_end/testcases/records/null_shorting.dart.strong.transformed.expect b/pkg/front_end/testcases/records/null_shorting.dart.strong.transformed.expect
index 4c09897..15c309f 100644
--- a/pkg/front_end/testcases/records/null_shorting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/records/null_shorting.dart.strong.transformed.expect
@@ -147,7 +147,7 @@
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t11 = record in #t11 == null ?{core::bool?} null : #t11{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int}.{core::int::isEven}{core::bool};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t12 = record in #t12 == null ?{core::int?} null : #t12{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String}.{core::String::length}{core::int};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t13 = record in #t13 == null ?{core::bool?} null : #t13{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.d{core::double}.{core::num::isNaN}{core::bool};
-  let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t14 = record in #t14 == null ?{() →? void} null : #t14{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void}.call;
+  let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t14 = record in #t14 == null ?{() →? void} null : #t14{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t15 = record in #t15 == null ?{() →? void} null : #t15{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.c{self::Class}.{self::Class::call}{() → void};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t16 = list in #t16 == null ?{core::int?} null : #t16{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t17 = list in #t17 == null ?{core::String?} null : #t17{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String};
@@ -162,7 +162,7 @@
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t26 = list in #t26 == null ?{core::bool?} null : #t26{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int}.{core::int::isEven}{core::bool};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t27 = list in #t27 == null ?{core::int?} null : #t27{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String}.{core::String::length}{core::int};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t28 = list in #t28 == null ?{core::bool?} null : #t28{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.d{core::double}.{core::num::isNaN}{core::bool};
-  let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t29 = list in #t29 == null ?{() →? void} null : #t29{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void}.call;
+  let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t29 = list in #t29 == null ?{() →? void} null : #t29{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t30 = list in #t30 == null ?{() →? void} null : #t30{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.c{self::Class}.{self::Class::call}{() → void};
 }
 static extension-member method _extension#0|call(lowered final core::int #this) → void {}
diff --git a/pkg/front_end/testcases/records/null_shorting.dart.weak.transformed.expect b/pkg/front_end/testcases/records/null_shorting.dart.weak.transformed.expect
index 4c09897..15c309f 100644
--- a/pkg/front_end/testcases/records/null_shorting.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/records/null_shorting.dart.weak.transformed.expect
@@ -147,7 +147,7 @@
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t11 = record in #t11 == null ?{core::bool?} null : #t11{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int}.{core::int::isEven}{core::bool};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t12 = record in #t12 == null ?{core::int?} null : #t12{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String}.{core::String::length}{core::int};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t13 = record in #t13 == null ?{core::bool?} null : #t13{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.d{core::double}.{core::num::isNaN}{core::bool};
-  let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t14 = record in #t14 == null ?{() →? void} null : #t14{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void}.call;
+  let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t14 = record in #t14 == null ?{() →? void} null : #t14{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void};
   let final(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})? #t15 = record in #t15 == null ?{() →? void} null : #t15{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.c{self::Class}.{self::Class::call}{() → void};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t16 = list in #t16 == null ?{core::int?} null : #t16{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t17 = list in #t17 == null ?{core::String?} null : #t17{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String};
@@ -162,7 +162,7 @@
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t26 = list in #t26 == null ?{core::bool?} null : #t26{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$1{core::int}.{core::int::isEven}{core::bool};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t27 = list in #t27 == null ?{core::int?} null : #t27{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.$2{core::String}.{core::String::length}{core::int};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t28 = list in #t28 == null ?{core::bool?} null : #t28{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.d{core::double}.{core::num::isNaN}{core::bool};
-  let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t29 = list in #t29 == null ?{() →? void} null : #t29{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void}.call;
+  let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t29 = list in #t29 == null ?{() →? void} null : #t29{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.f{() → void};
   let final core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>? #t30 = list in #t30 == null ?{() →? void} null : #t30{core::List<(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})>}.{core::Iterable::first}{(core::int, core::String, {required c: self::Class, required d: core::double, required f: () → void})}.c{self::Class}.{self::Class::call}{() → void};
 }
 static extension-member method _extension#0|call(lowered final core::int #this) → void {}
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index f86ff95..6e656cc 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -126,4 +126,10 @@
     return forInLowering.transformForInStatement(
         node, _currentFunctionNode, _staticTypeContext);
   }
+
+  @override
+  visitFunctionTearOff(FunctionTearOff node) {
+    node.transformChildren(this);
+    return node.receiver;
+  }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 0e4425c..56bb000 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -1899,11 +1899,6 @@
   }
 
   @override
-  TypeExpr visitFunctionTearOff(FunctionTearOff node) {
-    return _handlePropertyGet(node, node.receiver, null, Name('call'));
-  }
-
-  @override
   TypeExpr visitDynamicGet(DynamicGet node) {
     return _handlePropertyGet(node, node.receiver, null, node.name);
   }
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 53926a3..d414984 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -624,12 +624,6 @@
   }
 
   @override
-  visitFunctionTearOff(FunctionTearOff node) {
-    _annotateCallSite(node, null);
-    super.visitFunctionTearOff(node);
-  }
-
-  @override
   visitDynamicGet(DynamicGet node) {
     _annotateCallSite(node, null);
     super.visitDynamicGet(node);
@@ -1369,17 +1363,6 @@
   }
 
   @override
-  TreeNode visitFunctionTearOff(
-      FunctionTearOff node, TreeNode? removalSentinel) {
-    node.transformOrRemoveChildren(this);
-    if (_isUnreachable(node)) {
-      return _makeUnreachableCall([node.receiver]);
-    } else {
-      return node;
-    }
-  }
-
-  @override
   TreeNode visitInstanceSet(InstanceSet node, TreeNode? removalSentinel) {
     node.transformOrRemoveChildren(this);
     if (_isUnreachable(node)) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 7582458..1904c9c 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1055,7 +1055,9 @@
     case kInstanceTearOff:
       return BuildInstanceTearOff(position);
     case kFunctionTearOff:
-      return BuildFunctionTearOff(position);
+      // Removed by lowering kernel transformation.
+      UNREACHABLE();
+      break;
     case kInstanceSet:
       return BuildInstanceSet(position);
     case kDynamicSet:
@@ -2304,40 +2306,6 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildFunctionTearOff(TokenPosition* p) {
-  const intptr_t offset = ReaderOffset() - 1;     // Include the tag.
-  const TokenPosition position = ReadPosition();  // read position.
-  if (p != nullptr) *p = position;
-
-  const DirectCallMetadata direct_call =
-      direct_call_metadata_helper_.GetDirectTargetForPropertyGet(offset);
-  const InferredTypeMetadata result_type =
-      inferred_type_metadata_helper_.GetInferredType(offset);
-
-  Fragment instructions = BuildExpression();  // read receiver.
-
-  if (direct_call.check_receiver_for_null_) {
-    const auto receiver = MakeTemporary();
-    instructions += CheckNull(position, receiver, Symbols::GetCall());
-  }
-
-  if (!direct_call.target_.IsNull()) {
-    ASSERT(CompilerState::Current().is_aot());
-    instructions +=
-        StaticCall(position, direct_call.target_, 1, Array::null_array(),
-                   ICData::kNoRebind, &result_type);
-  } else {
-    const intptr_t kTypeArgsLen = 0;
-    const intptr_t kNumArgsChecked = 1;
-    instructions += InstanceCall(position, Symbols::GetCall(), Token::kGET,
-                                 kTypeArgsLen, 1, Array::null_array(),
-                                 kNumArgsChecked, Function::null_function(),
-                                 Function::null_function(), &result_type);
-  }
-
-  return instructions;
-}
-
 Fragment StreamingFlowGraphBuilder::BuildInstanceSet(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;  // Include the tag.
   ReadByte();                                  // read kind.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 80d3fb0..ce5ceeb 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -282,7 +282,6 @@
   Fragment BuildInstanceGet(TokenPosition* position);
   Fragment BuildDynamicGet(TokenPosition* position);
   Fragment BuildInstanceTearOff(TokenPosition* position);
-  Fragment BuildFunctionTearOff(TokenPosition* position);
   Fragment BuildInstanceSet(TokenPosition* position);
   Fragment BuildDynamicSet(TokenPosition* position);
   Fragment BuildAllocateInvocationMirrorCall(TokenPosition position,
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 61d0988..f059f33 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -421,9 +421,9 @@
       CalculateGetterNameFingerprint();  // read interface_target_reference.
       return;
     case kFunctionTearOff:
-      ReadPosition();                    // read position.
-      CalculateExpressionFingerprint();  // read receiver.
-      return;
+      // Removed by lowering kernel transformation.
+      UNREACHABLE();
+      break;
     case kInstanceSet:
       ReadByte();                                // read kind.
       ReadPosition();                            // read position.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 6c2dfc7..903f911 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2517,9 +2517,9 @@
       SkipInterfaceMemberNameReference();  // read interface_target_reference.
       return;
     case kFunctionTearOff:
-      ReadPosition();    // read position.
-      SkipExpression();  // read receiver.
-      return;
+      // Removed by lowering kernel transformation.
+      UNREACHABLE();
+      break;
     case kInstanceSet:
       ReadByte();                          // read kind.
       ReadPosition();                      // read position.
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 2594557..845840c 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -682,9 +682,9 @@
       helper_.SkipInterfaceMemberNameReference();
       return;
     case kFunctionTearOff:
-      helper_.ReadPosition();  // read position.
-      VisitExpression();       // read receiver.
-      return;
+      // Removed by lowering kernel transformation.
+      UNREACHABLE();
+      break;
     case kInstanceSet:
       helper_.ReadByte();      // read kind.
       helper_.ReadPosition();  // read position.