Version 2.15.0-181.0.dev

Merge commit '82affd7ac6fe466a8b8cb51a4ddd0d59fc1110bb' into 'dev'
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 4a1e4c1..09c18e0 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -547,15 +547,13 @@
     for (var driver in driverMap.values) {
       var needsUriReset = false;
       for (var event in fileEvents) {
-        if (event.type == ChangeType.ADD) {
-          driver.addFile(event.path);
+        driver.changeFile(event.path);
+        if (event.type == ChangeType.ADD || event.type == ChangeType.REMOVE) {
           needsUriReset = true;
         }
-        if (event.type == ChangeType.MODIFY) driver.changeFile(event.path);
-        if (event.type == ChangeType.REMOVE) driver.removeFile(event.path);
       }
-      // Since the file has been created after we've searched for it, the
-      // URI resolution is likely wrong, so we need to reset it.
+      // If a file was created or removed, the URI resolution is likely wrong,
+      // so we need to reset it.
       if (needsUriReset) driver.resetUriResolution();
     }
   }
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 86b6e5f..ca9b731 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -7,15 +7,14 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analyzer_utilities/package_root.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 void main() => defineTests();
 
 String get _serverSourcePath {
-  var script = Platform.script.toFilePath(windows: Platform.isWindows);
-  var pkgPath = path.normalize(path.join(path.dirname(script), '..', '..'));
-  return path.join(pkgPath, 'analysis_server');
+  return path.join(packageRoot, 'analysis_server');
 }
 
 void defineTests() {
@@ -26,8 +25,14 @@
       expect(benchmarks, isNotEmpty);
     });
 
+    const benchmarkIdsToSkip = {
+      'analysis-flutter-analyze',
+      'das-flutter-completion',
+      'lsp-flutter-completion'
+    };
+
     for (var benchmarkId in benchmarks) {
-      if (benchmarkId == 'analysis-flutter-analyze') {
+      if (benchmarkIdsToSkip.contains(benchmarkId)) {
         continue;
       }
 
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 6d60a5f..84e0d7e 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -4,4 +4,4 @@
 
 export 'package:_fe_analyzer_shared/src/scanner/errors.dart'
     show ScannerErrorCode;
-export 'package:analyzer/src/dart/error/syntactic_errors.analyzer.g.dart';
+export 'package:analyzer/src/dart/error/syntactic_errors.g.dart';
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
similarity index 100%
rename from pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart
rename to pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index b75a215..aa3aec8 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -55,6 +55,7 @@
   @override
   void clearCache() {
     _sourceCache.clear();
+    _workspace.clearCache();
   }
 
   @override
@@ -237,6 +238,10 @@
   @override
   UriResolver get packageUriResolver => BazelPackageUriResolver(this);
 
+  void clearCache() {
+    _directoryToPackage.clear();
+  }
+
   @override
   SourceFactory createSourceFactory(
     DartSdk? sdk,
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index acc861c..9ed18ff 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -31,14 +31,7 @@
   String analyzerPath = pathContext.join(packageRoot, 'analyzer');
   return CodePath.from([
     [analyzerPath, 'lib', 'src', 'dart', 'error', 'hint_codes.g.dart'],
-    [
-      analyzerPath,
-      'lib',
-      'src',
-      'dart',
-      'error',
-      'syntactic_errors.analyzer.g.dart'
-    ],
+    [analyzerPath, 'lib', 'src', 'dart', 'error', 'syntactic_errors.g.dart'],
     [analyzerPath, 'lib', 'src', 'error', 'codes.g.dart'],
     [analyzerPath, 'lib', 'src', 'pubspec', 'pubspec_warning_code.g.dart'],
   ], [
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index ac733b9..f41653c 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -81,8 +81,7 @@
       type: 'HINT',
       extraImports: ['package:analyzer/src/error/analyzer_error_code.dart']),
   _ErrorClassInfo(
-      // TODO(paulberry): rename to `syntactic_errors.g.dart`.
-      filePath: 'lib/src/dart/error/syntactic_errors.analyzer.g.dart',
+      filePath: 'lib/src/dart/error/syntactic_errors.g.dart',
       name: 'ParserErrorCode',
       type: 'SYNTACTIC_ERROR',
       severity: 'ERROR',
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index ac7b321..29fa3a2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -364,8 +364,50 @@
     ExpressionInferenceResult operandResult = inferrer.inferExpression(
         node.expression, const UnknownType(), true,
         isVoidAllowed: true);
-    node.expression = operandResult.expression..parent = node;
+    Expression operand = operandResult.expression;
     DartType operandType = operandResult.inferredType;
+    if (operandType is! FunctionType) {
+      ObjectAccessTarget callMember = inferrer.findInterfaceMember(
+          operandType, callName, operand.fileOffset,
+          callSiteAccessKind: CallSiteAccessKind.getterInvocation,
+          includeExtensionMethods: true);
+      switch (callMember.kind) {
+        case ObjectAccessTargetKind.instanceMember:
+          Member? target = callMember.member;
+          if (target is Procedure && target.kind == ProcedureKind.Method) {
+            operandType = inferrer.getGetterType(callMember, operandType);
+            operand = new InstanceTearOff(
+                InstanceAccessKind.Instance, operand, callName,
+                interfaceTarget: target, resultType: operandType)
+              ..fileOffset = operand.fileOffset;
+          }
+          break;
+        case ObjectAccessTargetKind.extensionMember:
+          if (callMember.tearoffTarget != null &&
+              callMember.extensionMethodKind == ProcedureKind.Method) {
+            operandType = inferrer.getGetterType(callMember, operandType);
+            operand = new StaticInvocation(
+                callMember.tearoffTarget as Procedure,
+                new Arguments(<Expression>[operand],
+                    types: callMember.inferredExtensionTypeArguments)
+                  ..fileOffset = operand.fileOffset)
+              ..fileOffset = operand.fileOffset;
+          }
+          break;
+        case ObjectAccessTargetKind.nullableInstanceMember:
+        case ObjectAccessTargetKind.objectMember:
+        case ObjectAccessTargetKind.nullableCallFunction:
+        case ObjectAccessTargetKind.nullableExtensionMember:
+        case ObjectAccessTargetKind.dynamic:
+        case ObjectAccessTargetKind.never:
+        case ObjectAccessTargetKind.invalid:
+        case ObjectAccessTargetKind.missing:
+        case ObjectAccessTargetKind.ambiguous:
+        case ObjectAccessTargetKind.callFunction:
+          break;
+      }
+    }
+    node.expression = operand..parent = node;
     Expression result = node;
     DartType resultType = const InvalidType();
     if (operandType is FunctionType) {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart
new file mode 100644
index 0000000..692cc20
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {
+  c<int>; // ok
+  i<int>; // ok
+  t<int>; // ok
+  s<int>; // ok
+}
+
+test<T extends Class?, S extends int>(
+    Class? c1,
+    GetterCall c2,
+    int? i,
+    T t1,
+    T? t2,
+    S? s,
+    void Function<T>()? f1,
+    Never n,
+    dynamic d,
+    String a,
+    double b,
+    bool c,
+    FutureOr<Class> f2,
+    Function f3) {
+  c1<int>; // error
+  c2<int>; // error
+  i<int>; // error
+  t1<int>; // error
+  t2<int>; // error
+  s<int>; // error
+  f1<int>; // error
+  n<int>; // error
+  d<int>; // error
+  a<int>; // error
+  b<int>; // error
+  c<int>; // error
+  f2<int>; // error
+  f3<int>; // error
+}
+
+class Class {
+  call<T>() {}
+}
+
+class GetterCall {
+  void Function<T>() get call => <T>() {};
+}
+
+extension Extension on int {
+  call<T>() {}
+}
+
+extension ExtensionGetter on double {
+  void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+  set call(void Function<T>() value) {}
+}
+
+extension Ambiguous1 on String {
+  call<T>() {}
+}
+
+extension Ambiguous2 on String {
+  call<T>() {}
+}
+
+main() {
+  method(Class(), 0, Class(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+//   i<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+//   t1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+//   t2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+//   s<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+//   n<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   d<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+//   a<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+//   b<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+//   c<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   f2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   f3<int>; // error
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    : super core::Object::•()
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+  c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(i)<core::int>;
+  t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+  i<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+  t1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+  t2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+  s<int>; // error
+   ^";
+  f1<core::int>;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+  n<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  d<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+  a<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+  b<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+  c<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  f2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  f3<int>; // error
+    ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+  self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+//   i<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+//   t1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+//   t2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+//   s<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+//   n<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   d<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+//   a<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+//   b<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+//   c<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   f2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   f3<int>; // error
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    : super core::Object::•()
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+  c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(i)<core::int>;
+  t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+  i<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+  t1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+  t2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+  s<int>; // error
+   ^";
+  f1<core::int>;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+  n<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  d<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+  a<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+  b<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+  c<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  f2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  f3<int>; // error
+    ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+  self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect
new file mode 100644
index 0000000..807f530
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect
@@ -0,0 +1,48 @@
+import 'dart:async';
+
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {}
+test<T extends Class?, S extends int>(
+    Class? c1,
+    GetterCall c2,
+    int? i,
+    T t1,
+    T? t2,
+    S? s,
+    void Function<T>()? f1,
+    Never n,
+    dynamic d,
+    String a,
+    double b,
+    bool c,
+    FutureOr<Class> f2,
+    Function f3) {}
+
+class Class {
+  call<T>() {}
+}
+
+class GetterCall {
+  void Function<T>() get call => <T>() {};
+}
+
+extension Extension on int {
+  call<T>() {}
+}
+
+extension ExtensionGetter on double {
+  void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+  set call(void Function<T>() value) {}
+}
+
+extension Ambiguous1 on String {
+  call<T>() {}
+}
+
+extension Ambiguous2 on String {
+  call<T>() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5c31ac3
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect
@@ -0,0 +1,47 @@
+import 'dart:async';
+
+class Class {
+  call<T>() {}
+}
+
+class GetterCall {
+  void Function<T>() get call => <T>() {};
+}
+
+extension Ambiguous1 on String {
+  call<T>() {}
+}
+
+extension Ambiguous2 on String {
+  call<T>() {}
+}
+
+extension Extension on int {
+  call<T>() {}
+}
+
+extension ExtensionGetter on double {
+  void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+  set call(void Function<T>() value) {}
+}
+
+main() {}
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {}
+test<T extends Class?, S extends int>(
+    Class? c1,
+    GetterCall c2,
+    int? i,
+    T t1,
+    T? t2,
+    S? s,
+    void Function<T>()? f1,
+    Never n,
+    dynamic d,
+    String a,
+    double b,
+    bool c,
+    FutureOr<Class> f2,
+    Function f3) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+//   i<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+//   t1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+//   t2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+//   s<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+//   n<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   d<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+//   a<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+//   b<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+//   c<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   f2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   f3<int>; // error
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    : super core::Object::•()
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+  c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(i)<core::int>;
+  t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+  i<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+  t1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+  t2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+  s<int>; // error
+   ^";
+  f1<core::int>;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+  n<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  d<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+  a<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+  b<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+  c<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  f2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  f3<int>; // error
+    ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+  self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect
new file mode 100644
index 0000000..a47d813
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic
+    ;
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    ;
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic
+  ;
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic
+  ;
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic
+  ;
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  ;
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void
+  ;
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic
+  ;
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic
+  ;
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+//   i<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+//   t1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+//   t2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+//   s<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+//   n<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   d<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+//   a<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+//   b<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+//   c<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   f2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   f3<int>; // error
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    : super core::Object::•()
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+  c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(i)<core::int>;
+  t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+  i<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+  t1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+  t2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+  s<int>; // error
+   ^";
+  f1<core::int>;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+  n<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  d<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+  a<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+  b<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+  c<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  f2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  f3<int>; // error
+    ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+  self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/tests/language/explicit_type_instantiation_parsing_test.dart b/tests/language/explicit_type_instantiation_parsing_test.dart
index e0584e7..a7c748c 100644
--- a/tests/language/explicit_type_instantiation_parsing_test.dart
+++ b/tests/language/explicit_type_instantiation_parsing_test.dart
@@ -307,9 +307,7 @@
   // Valid only if parenthesized.
   expect1((Z < X, X >) < 4);
 
-  // Still can't instantiate something non-generic.
-  /**/ v<int>;
-  //    ^^^^^
-  // [cfe] The static type of the explicit instantiation operand must be a generic function type but is 'Object?'.
-  // [analyzer] unspecified
+  // Since `v` has type `Object?`, this is an extension invocation of the
+  // implicit `call` tear off.
+  /**/ v<int, String>;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 4f88fa0..b6ef0a3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 180
+PRERELEASE 181
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/test_generators/async_nested_test_generator.dart b/tools/test_generators/async_nested_test_generator.dart
index 658e917..b03a22f 100644
--- a/tools/test_generators/async_nested_test_generator.dart
+++ b/tools/test_generators/async_nested_test_generator.dart
@@ -39,7 +39,7 @@
         String name = "async_nested_${maxSize}_${i}_test.dart";
         asyncFile.renameSync(name);
         print(" -> Created $name");
-        print("    (you might want to run dartfmt -w $name).");
+        print("    (you might want to run 'dart format $name').");
       }
     }
   }