Version 2.15.0-87.0.dev

Merge commit 'd120af39c6bcd7e1f333baea64380eed0a4645b6' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 2a2955a..38d7818 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4833,6 +4833,8 @@
     } else if (type is ParserRecovery) {
       push(new ParserErrorGenerator(
           this, nameToken, fasta.messageSyntheticToken));
+    } else if (type is InvalidExpression) {
+      push(type);
     } else if (type is Expression) {
       push(createInstantiationAndInvocation(
           () => type, typeArguments, name, name, arguments,
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart
new file mode 100644
index 0000000..209a1f4
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart
@@ -0,0 +1,9 @@
+// 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.
+
+class A {}
+
+test() => A.const.toString();
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.expect
new file mode 100644
index 0000000..912d264
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+// Try inserting an identifier before 'const'.
+// test() => A.const.toString();
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+Try inserting an identifier before 'const'.
+test() => A.const.toString();
+            ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.transformed.expect
new file mode 100644
index 0000000..912d264
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+// Try inserting an identifier before 'const'.
+// test() => A.const.toString();
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+Try inserting an identifier before 'const'.
+test() => A.const.toString();
+            ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.textual_outline.expect
new file mode 100644
index 0000000..a9b23c0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+class A {}
+test() => A.const.toString();
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.expect
new file mode 100644
index 0000000..912d264
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+// Try inserting an identifier before 'const'.
+// test() => A.const.toString();
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+Try inserting an identifier before 'const'.
+test() => A.const.toString();
+            ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.outline.expect
new file mode 100644
index 0000000..3fd2ec8
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.transformed.expect
new file mode 100644
index 0000000..912d264
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+// Try inserting an identifier before 'const'.
+// test() => A.const.toString();
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+Try inserting an identifier before 'const'.
+test() => A.const.toString();
+            ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index c24938e..45bfa23 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -23,6 +23,7 @@
 const_functions/const_functions_const_ctor: FormatterCrash
 const_functions/const_functions_const_ctor_error: FormatterCrash
 const_functions/const_functions_const_factory: FormatterCrash
+constructor_tearoffs/issue46133: FormatterCrash
 constructor_tearoffs/issue47075: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index c36a00d..ea2e9f8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 86
+PRERELEASE 87
 PRERELEASE_PATCH 0
\ No newline at end of file