Do not attempt to write ty::Err on binding that isn't from current HIR Owner

Fix #123009.
This commit is contained in:
Esteban Küber 2024-03-29 19:05:54 +00:00
parent 399fa2f6e4
commit d54e9833e3
3 changed files with 46 additions and 10 deletions

View File

@ -1916,18 +1916,11 @@ fn overwrite_local_ty_if_err(
pat: &'tcx hir::Pat<'tcx>, pat: &'tcx hir::Pat<'tcx>,
ty: Ty<'tcx>, ty: Ty<'tcx>,
) { ) {
struct V<'tcx> { struct V {
tcx: TyCtxt<'tcx>,
pat_hir_ids: Vec<hir::HirId>, pat_hir_ids: Vec<hir::HirId>,
} }
impl<'tcx> Visitor<'tcx> for V<'tcx> { impl<'tcx> Visitor<'tcx> for V {
type NestedFilter = rustc_middle::hir::nested_filter::All;
fn nested_visit_map(&mut self) -> Self::Map {
self.tcx.hir()
}
fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) { fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) {
self.pat_hir_ids.push(p.hir_id); self.pat_hir_ids.push(p.hir_id);
hir::intravisit::walk_pat(self, p); hir::intravisit::walk_pat(self, p);
@ -1938,7 +1931,7 @@ fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) {
let err = Ty::new_error(self.tcx, guar); let err = Ty::new_error(self.tcx, guar);
self.write_ty(hir_id, err); self.write_ty(hir_id, err);
self.write_ty(pat.hir_id, err); self.write_ty(pat.hir_id, err);
let mut visitor = V { tcx: self.tcx, pat_hir_ids: vec![] }; let mut visitor = V { pat_hir_ids: vec![] };
hir::intravisit::walk_pat(&mut visitor, pat); hir::intravisit::walk_pat(&mut visitor, pat);
// Mark all the subpatterns as `{type error}` as well. This allows errors for specific // Mark all the subpatterns as `{type error}` as well. This allows errors for specific
// subpatterns to be silenced. // subpatterns to be silenced.

View File

@ -0,0 +1,7 @@
fn main() {
let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
//~^ ERROR expected a pattern, found an expression
//~| ERROR cannot find type `T` in this scope
//~| ERROR type and const arguments are not allowed on builtin type `str`
//~| ERROR expected unit struct, unit variant or constant, found associated function `str<, T>::as_bytes`
}

View File

@ -0,0 +1,36 @@
error: expected a pattern, found an expression
--> $DIR/ensure-overriding-bindings-in-pattern-with-ty-err-doesnt-ice.rs:2:31
|
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
| ^^^^^^^^^^^^^^^^^^ arbitrary expressions are not allowed in patterns
error[E0412]: cannot find type `T` in this scope
--> $DIR/ensure-overriding-bindings-in-pattern-with-ty-err-doesnt-ice.rs:2:55
|
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
| ^ not found in this scope
error[E0109]: type and const arguments are not allowed on builtin type `str`
--> $DIR/ensure-overriding-bindings-in-pattern-with-ty-err-doesnt-ice.rs:2:15
|
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
| --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ type and const arguments not allowed
| |
| not allowed on builtin type `str`
|
help: primitive type `str` doesn't have generic parameters
|
LL - let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
LL + let str::as_bytes;
|
error[E0533]: expected unit struct, unit variant or constant, found associated function `str<, T>::as_bytes`
--> $DIR/ensure-overriding-bindings-in-pattern-with-ty-err-doesnt-ice.rs:2:9
|
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not a unit struct, unit variant or constant
error: aborting due to 4 previous errors
Some errors have detailed explanations: E0109, E0412, E0533.
For more information about an error, try `rustc --explain E0109`.