Do not attempt to write ty::Err
on binding that isn't from current HIR Owner
Fix #123009.
This commit is contained in:
parent
399fa2f6e4
commit
d54e9833e3
@ -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.
|
||||||
|
@ -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`
|
||||||
|
}
|
@ -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`.
|
Loading…
Reference in New Issue
Block a user