Rollup merge of #119420 - cjgillot:issue-119295, r=compiler-errors
Handle ForeignItem as TAIT scope. Fixes #119295
This commit is contained in:
commit
9585ebc269
@ -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::Item(it) => locator.visit_item(it),
|
||||||
Node::ImplItem(it) => locator.visit_impl_item(it),
|
Node::ImplItem(it) => locator.visit_impl_item(it),
|
||||||
Node::TraitItem(it) => locator.visit_trait_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),
|
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);
|
self.check(it.owner_id.def_id);
|
||||||
intravisit::walk_trait_item(self, it);
|
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>(
|
pub(super) fn find_opaque_ty_constraints_for_rpit<'tcx>(
|
||||||
|
21
tests/ui/type-alias-impl-trait/nested-in-anon-const.rs
Normal file
21
tests/ui/type-alias-impl-trait/nested-in-anon-const.rs
Normal file
@ -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
tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr
Normal file
20
tests/ui/type-alias-impl-trait/nested-in-anon-const.stderr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
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[E0308]: mismatched types
|
||||||
|
--> $DIR/nested-in-anon-const.rs:12:17
|
||||||
|
|
|
||||||
|
LL | / {
|
||||||
|
LL | | type B<Z> = impl Sized;
|
||||||
|
LL | |
|
||||||
|
LL | | },
|
||||||
|
| |_________________^ expected `usize`, found `()`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user