[cfe] Update name of private forwarding constructor tear-offs

This updates the synthesized name of the private forwarding constructor
tear-offs to use the library of the target constructor instead of the
library of the mixin application.

Change-Id: I2a5fb62f2c572bb02db177e5bda5e222cc5818f8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/434720
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/kernel/kernel_target.dart b/pkg/front_end/lib/src/kernel/kernel_target.dart
index 836c6ce..04cebee 100644
--- a/pkg/front_end/lib/src/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/kernel/kernel_target.dart
@@ -1039,7 +1039,10 @@
     }
 
     Procedure? constructorTearOff = createConstructorTearOffProcedure(
-        new MemberName(libraryBuilder.libraryName,
+        new MemberName(
+            superConstructor.name.isPrivate
+                ? new LibraryName(superConstructor.name.libraryReference!)
+                : libraryBuilder.libraryName,
             constructorTearOffName(superConstructor.name.text)),
         libraryBuilder,
         cls.fileUri,
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart
new file mode 100644
index 0000000..ab7836b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2025, 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 'private_lib.dart';
+
+mixin M {}
+
+class D = A with M;
+
+class E = B with M; // TODO(johnniwinther): This should not be an error.
+
+class F = C with M;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.expect
new file mode 100644
index 0000000..c903ca8
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.expect
@@ -0,0 +1,161 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+  static synthetic method pri::_#_#tearOff() → self::D
+    return new self::D::_();
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+  static synthetic method _#new#tearOff() → self::E
+    return new self::E::•();
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+  static synthetic method _#named#tearOff() → self::F
+    return new self::F::named();
+  static synthetic method pri::_#_#tearOff() → self::F
+    return new self::F::_();
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+  static synthetic method _#_#tearOff() → pri::A
+    return new pri::A::_();
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+  static synthetic method _#_#tearOff() → pri::B
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+  static synthetic method _#new#tearOff() → pri::_B
+    return new pri::_B::•();
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+  static synthetic method _#named#tearOff() → pri::C
+    return new pri::C::named();
+  static synthetic method _#_#tearOff() → pri::C
+    return new pri::C::_();
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+  static synthetic method _#_#tearOff() → pri::G
+    return new pri::G::_();
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+  static synthetic method _#_#tearOff() → pri::H
+    return new pri::H::_();
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+  static synthetic method _#named#tearOff() → pri::I
+    return new pri::I::named();
+  static synthetic method _#_#tearOff() → pri::I
+    return new pri::I::_();
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.modular.expect
new file mode 100644
index 0000000..c903ca8
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.modular.expect
@@ -0,0 +1,161 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+  static synthetic method pri::_#_#tearOff() → self::D
+    return new self::D::_();
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+  static synthetic method _#new#tearOff() → self::E
+    return new self::E::•();
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+  static synthetic method _#named#tearOff() → self::F
+    return new self::F::named();
+  static synthetic method pri::_#_#tearOff() → self::F
+    return new self::F::_();
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+  static synthetic method _#_#tearOff() → pri::A
+    return new pri::A::_();
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+  static synthetic method _#_#tearOff() → pri::B
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+  static synthetic method _#new#tearOff() → pri::_B
+    return new pri::_B::•();
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+  static synthetic method _#named#tearOff() → pri::C
+    return new pri::C::named();
+  static synthetic method _#_#tearOff() → pri::C
+    return new pri::C::_();
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+  static synthetic method _#_#tearOff() → pri::G
+    return new pri::G::_();
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+  static synthetic method _#_#tearOff() → pri::H
+    return new pri::H::_();
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+  static synthetic method _#named#tearOff() → pri::I
+    return new pri::I::named();
+  static synthetic method _#_#tearOff() → pri::I
+    return new pri::I::_();
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.outline.expect
new file mode 100644
index 0000000..d10401f
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.outline.expect
@@ -0,0 +1,94 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+  static synthetic method pri::_#_#tearOff() → self::D
+    return new self::D::_();
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    ;
+  static synthetic method _#new#tearOff() → self::E
+    return new self::E::•();
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+  static synthetic method _#named#tearOff() → self::F
+    return new self::F::named();
+  static synthetic method pri::_#_#tearOff() → self::F
+    return new self::F::_();
+}
+
+library;
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    ;
+  static synthetic method _#_#tearOff() → pri::A
+    return new pri::A::_();
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+  static synthetic method _#_#tearOff() → pri::B
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    ;
+  static synthetic method _#new#tearOff() → pri::_B
+    return new pri::_B::•();
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    ;
+  constructor _() → pri::C
+    ;
+  static synthetic method _#named#tearOff() → pri::C
+    return new pri::C::named();
+  static synthetic method _#_#tearOff() → pri::C
+    return new pri::C::_();
+}
+class G extends self::D {
+  constructor _() → pri::G
+    ;
+  static synthetic method _#_#tearOff() → pri::G
+    return new pri::G::_();
+}
+class H extends self::E {
+  constructor _() → pri::H
+    ;
+  static synthetic method _#_#tearOff() → pri::H
+    return new pri::H::_();
+}
+class I extends self::F {
+  constructor named() → pri::I
+    ;
+  constructor _() → pri::I
+    ;
+  static synthetic method _#named#tearOff() → pri::I
+    return new pri::I::named();
+  static synthetic method _#_#tearOff() → pri::I
+    return new pri::I::_();
+}
+static method method() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.transformed.expect
new file mode 100644
index 0000000..6aeb335
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.strong.transformed.expect
@@ -0,0 +1,161 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D extends pri::A implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+  static synthetic method pri::_#_#tearOff() → self::D
+    return new self::D::_();
+}
+class E extends pri::B implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+  static synthetic method _#new#tearOff() → self::E
+    return new self::E::•();
+}
+class F extends pri::C implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+  static synthetic method _#named#tearOff() → self::F
+    return new self::F::named();
+  static synthetic method pri::_#_#tearOff() → self::F
+    return new self::F::_();
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+  static synthetic method _#_#tearOff() → pri::A
+    return new pri::A::_();
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+  static synthetic method _#_#tearOff() → pri::B
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+  static synthetic method _#new#tearOff() → pri::_B
+    return new pri::_B::•();
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+  static synthetic method _#named#tearOff() → pri::C
+    return new pri::C::named();
+  static synthetic method _#_#tearOff() → pri::C
+    return new pri::C::_();
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+  static synthetic method _#_#tearOff() → pri::G
+    return new pri::G::_();
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+  static synthetic method _#_#tearOff() → pri::H
+    return new pri::H::_();
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+  static synthetic method _#named#tearOff() → pri::I
+    return new pri::I::named();
+  static synthetic method _#_#tearOff() → pri::I
+    return new pri::I::_();
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline.expect
new file mode 100644
index 0000000..ac80ac0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+import 'private_lib.dart';
+
+mixin M {}
+
+class D = A with M;
+
+class E = B with M;
+
+class F = C with M;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c785d0d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+import 'private_lib.dart';
+
+class D = A with M;
+
+class E = B with M;
+
+class F = C with M;
+
+mixin M {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart
new file mode 100644
index 0000000..ba0c6db
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/private_lib.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2025, 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 'private.dart';
+
+class A {
+  A._();
+}
+
+class B {
+  factory B._() = _B;
+}
+
+class _B implements B {}
+
+class C {
+  C.named();
+  C._();
+}
+
+class G extends D {
+  G._() : super._(); // TODO(johnniwinther): This should be an error.
+}
+
+class H extends E {
+  H._() : super._(); // Error
+}
+
+class I extends F {
+  I.named() : super.named(); // Ok
+  I._() : super._(); // TODO(johnniwinther): This should be an error.
+}
+
+method() {
+  D._(); // Error
+  D._; // Error
+  E._(); // Error
+  E._; // Error
+  F._(); // Error
+  F._; // Error
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart b/pkg/front_end/testcases/constructor_tearoffs/private.dart
new file mode 100644
index 0000000..ab7836b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2025, 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 'private_lib.dart';
+
+mixin M {}
+
+class D = A with M;
+
+class E = B with M; // TODO(johnniwinther): This should not be an error.
+
+class F = C with M;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.expect
new file mode 100644
index 0000000..3572fc6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.expect
@@ -0,0 +1,135 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.modular.expect
new file mode 100644
index 0000000..3572fc6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.modular.expect
@@ -0,0 +1,135 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.outline.expect
new file mode 100644
index 0000000..ac69a5b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.outline.expect
@@ -0,0 +1,68 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D = pri::A with self::M {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+}
+class E = pri::B with self::M {
+  synthetic constructor •() → self::E
+    ;
+}
+class F = pri::C with self::M {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+}
+
+library;
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    ;
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    ;
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    ;
+  constructor _() → pri::C
+    ;
+}
+class G extends self::D {
+  constructor _() → pri::G
+    ;
+}
+class H extends self::E {
+  constructor _() → pri::H
+    ;
+}
+class I extends self::F {
+  constructor named() → pri::I
+    ;
+  constructor _() → pri::I
+    ;
+}
+static method method() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.transformed.expect
new file mode 100644
index 0000000..1d5a115
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.strong.transformed.expect
@@ -0,0 +1,135 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private.dart:11:7: Error: The superclass, 'B', has no unnamed constructor that takes no arguments.
+// class E = B with M; // TODO(johnniwinther): This should not be an error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "private_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_lib.dart";
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class D extends pri::A implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor pri::_() → self::D
+    : super pri::A::_()
+    ;
+}
+class E extends pri::B implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::E
+    : invalid-initializer
+    ;
+}
+class F extends pri::C implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor named() → self::F
+    : super pri::C::named()
+    ;
+  synthetic constructor pri::_() → self::F
+    : super pri::C::_()
+    ;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+//   H._() : super._(); // Error
+//           ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+//   D._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+//   D._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+//   E._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+//   E._; // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+//   F._(); // Error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+//   F._; // Error
+//     ^
+//
+import self as pri;
+import "dart:core" as core;
+import "private.dart" as self;
+
+import "org-dartlang-testcase:///private.dart";
+
+class A extends core::Object {
+  constructor _() → pri::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  static factory _() → pri::B /* redirection-target: pri::_B::• */
+    return new pri::_B::•();
+}
+class _B extends core::Object implements pri::B {
+  synthetic constructor •() → pri::_B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  constructor named() → pri::C
+    : super core::Object::•()
+    ;
+  constructor _() → pri::C
+    : super core::Object::•()
+    ;
+}
+class G extends self::D {
+  constructor _() → pri::G
+    : super self::D::_()
+    ;
+}
+class H extends self::E {
+  constructor _() → pri::H
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:27:11: Error: Superclass has no constructor named 'B._'.
+  H._() : super._(); // Error
+          ^^^^^"
+    ;
+}
+class I extends self::F {
+  constructor named() → pri::I
+    : super self::F::named()
+    ;
+  constructor _() → pri::I
+    : super self::F::_()
+    ;
+}
+static method method() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:36:5: Error: Member not found: 'D._'.
+  D._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:37:5: Error: Member not found: '_'.
+  D._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:38:5: Error: Member not found: 'E._'.
+  E._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:39:5: Error: Member not found: '_'.
+  E._; // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:40:5: Error: Member not found: 'F._'.
+  F._(); // Error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/private_lib.dart:41:5: Error: Member not found: '_'.
+  F._; // Error
+    ^";
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline.expect
new file mode 100644
index 0000000..ac80ac0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+import 'private_lib.dart';
+
+mixin M {}
+
+class D = A with M;
+
+class E = B with M;
+
+class F = C with M;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c785d0d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+import 'private_lib.dart';
+
+class D = A with M;
+
+class E = B with M;
+
+class F = C with M;
+
+mixin M {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/private_lib.dart b/pkg/front_end/testcases/constructor_tearoffs/private_lib.dart
new file mode 100644
index 0000000..ba0c6db
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/private_lib.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2025, 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 'private.dart';
+
+class A {
+  A._();
+}
+
+class B {
+  factory B._() = _B;
+}
+
+class _B implements B {}
+
+class C {
+  C.named();
+  C._();
+}
+
+class G extends D {
+  G._() : super._(); // TODO(johnniwinther): This should be an error.
+}
+
+class H extends E {
+  H._() : super._(); // Error
+}
+
+class I extends F {
+  I.named() : super.named(); // Ok
+  I._() : super._(); // TODO(johnniwinther): This should be an error.
+}
+
+method() {
+  D._(); // Error
+  D._; // Error
+  E._(); // Error
+  E._; // Error
+  F._(); // Error
+  F._; // Error
+}