From 76d616dc6fc0bd28a7bad772ead2cabd1de48047 Mon Sep 17 00:00:00 2001
From: Camille GILLOT <gillot.camille@gmail.com>
Date: Fri, 29 Dec 2023 20:04:03 +0000
Subject: [PATCH 1/2] Handle ForeignItem as TAIT scope.

---
 .../src/collect/type_of/opaque.rs             |  7 +++++++
 .../nested-in-anon-const.rs                   | 21 +++++++++++++++++++
 .../nested-in-anon-const.stderr               | 20 ++++++++++++++++++
 3 files changed, 48 insertions(+)
 create mode 100644 tests/ui/type-alias-impl-trait/nested-in-anon-const.rs
 create mode 100644 tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr

diff --git a/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs b/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
index 5a73097b0f6b3..04047e56c60ea 100644
--- a/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
+++ b/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
@@ -69,6 +69,7 @@ pub(super) fn find_opaque_ty_constraints_for_tait(tcx: TyCtxt<'_>, def_id: Local
             Node::Item(it) => locator.visit_item(it),
             Node::ImplItem(it) => locator.visit_impl_item(it),
             Node::TraitItem(it) => locator.visit_trait_item(it),
+            Node::ForeignItem(it) => locator.visit_foreign_item(it),
             other => bug!("{:?} is not a valid scope for an opaque type item", other),
         }
     }
@@ -240,6 +241,12 @@ impl<'tcx> intravisit::Visitor<'tcx> for TaitConstraintLocator<'tcx> {
         self.check(it.owner_id.def_id);
         intravisit::walk_trait_item(self, it);
     }
+    fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) {
+        trace!(?it.owner_id);
+        assert_ne!(it.owner_id.def_id, self.def_id);
+        self.check(it.owner_id.def_id);
+        intravisit::walk_foreign_item(self, it);
+    }
 }
 
 pub(super) fn find_opaque_ty_constraints_for_rpit<'tcx>(
diff --git a/tests/ui/type-alias-impl-trait/nested-in-anon-const.rs b/tests/ui/type-alias-impl-trait/nested-in-anon-const.rs
new file mode 100644
index 0000000000000..e9d53c99d041b
--- /dev/null
+++ b/tests/ui/type-alias-impl-trait/nested-in-anon-const.rs
@@ -0,0 +1,21 @@
+// Regression test for issue #119295.
+
+#![feature(type_alias_impl_trait)]
+
+type Bar<T> = T;
+type S<const A: usize> = [i32; A];
+
+extern "C" {
+    pub fn lint_me(
+        x: Bar<
+            S<
+                { //~ ERROR mismatched types
+                    type B<Z> = impl Sized;
+                    //~^ ERROR unconstrained opaque type
+                },
+            >,
+        >,
+    );
+}
+
+fn main() {}
diff --git a/tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr b/tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr
new file mode 100644
index 0000000000000..aa0c1076117cc
--- /dev/null
+++ b/tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr
@@ -0,0 +1,20 @@
+error[E0308]: mismatched types
+  --> $DIR/nested-in-anon-const.rs:12:17
+   |
+LL | /                 {
+LL | |                     type B<Z> = impl Sized;
+LL | |
+LL | |                 },
+   | |_________________^ expected `usize`, found `()`
+
+error: unconstrained opaque type
+  --> $DIR/nested-in-anon-const.rs:13:33
+   |
+LL |                     type B<Z> = impl Sized;
+   |                                 ^^^^^^^^^^
+   |
+   = note: `B` must be used in combination with a concrete type within the same item
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.

From 7fd2d8d21bb6d20c9abd4a321aab435ec2ab586b Mon Sep 17 00:00:00 2001
From: Camille GILLOT <gillot.camille@gmail.com>
Date: Sun, 31 Dec 2023 00:22:52 +0000
Subject: [PATCH 2/2] Do not run check on foreign items.

---
 compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs b/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
index 04047e56c60ea..da7279967dac1 100644
--- a/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
+++ b/compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
@@ -244,7 +244,7 @@ impl<'tcx> intravisit::Visitor<'tcx> for TaitConstraintLocator<'tcx> {
     fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) {
         trace!(?it.owner_id);
         assert_ne!(it.owner_id.def_id, self.def_id);
-        self.check(it.owner_id.def_id);
+        // No need to call `check`, as we do not run borrowck on foreign items.
         intravisit::walk_foreign_item(self, it);
     }
 }