Skip to content

Commit

Permalink
Rollup merge of rust-lang#119420 - cjgillot:issue-119295, r=compiler-…
Browse files Browse the repository at this point in the history
…errors

Handle ForeignItem as TAIT scope.

Fixes rust-lang#119295
  • Loading branch information
GuillaumeGomez committed Jan 5, 2024
2 parents 3a19a92 + 7fd2d8d commit 2dcaadb
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
7 changes: 7 additions & 0 deletions compiler/rustc_hir_analysis/src/collect/type_of/opaque.rs
Expand Up @@ -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),
}
}
Expand Down Expand Up @@ -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);
// No need to call `check`, as we do not run borrowck on foreign items.
intravisit::walk_foreign_item(self, it);
}
}

pub(super) fn find_opaque_ty_constraints_for_rpit<'tcx>(
Expand Down
21 changes: 21 additions & 0 deletions 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() {}
20 changes: 20 additions & 0 deletions 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`.

0 comments on commit 2dcaadb

Please sign in to comment.