Rollup merge of #104514 - chenyukang:yukang/fix-104513-ice, r=petrochenkov
Use node_ty_opt to avoid ICE in visit_ty Fixes #104513
This commit is contained in:
commit
80dc91c6c3
3 changed files with 30 additions and 3 deletions
|
@ -361,9 +361,12 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
|
||||||
|
|
||||||
fn visit_ty(&mut self, hir_ty: &'tcx hir::Ty<'tcx>) {
|
fn visit_ty(&mut self, hir_ty: &'tcx hir::Ty<'tcx>) {
|
||||||
intravisit::walk_ty(self, hir_ty);
|
intravisit::walk_ty(self, hir_ty);
|
||||||
let ty = self.fcx.node_ty(hir_ty.hir_id);
|
// If there are type checking errors, Type privacy pass will stop,
|
||||||
let ty = self.resolve(ty, &hir_ty.span);
|
// so we may not get the type from hid_id, see #104513
|
||||||
self.write_ty_to_typeck_results(hir_ty.hir_id, ty);
|
if let Some(ty) = self.fcx.node_ty_opt(hir_ty.hir_id) {
|
||||||
|
let ty = self.resolve(ty, &hir_ty.span);
|
||||||
|
self.write_ty_to_typeck_results(hir_ty.hir_id, ty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_infer(&mut self, inf: &'tcx hir::InferArg) {
|
fn visit_infer(&mut self, inf: &'tcx hir::InferArg) {
|
||||||
|
|
6
src/test/ui/typeck/issue-104513-ice.rs
Normal file
6
src/test/ui/typeck/issue-104513-ice.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
struct S;
|
||||||
|
fn f() {
|
||||||
|
let _: S<impl Oops> = S; //~ ERROR cannot find trait `Oops` in this scope
|
||||||
|
//~^ ERROR `impl Trait` only allowed in function and inherent method return types
|
||||||
|
}
|
||||||
|
fn main() {}
|
18
src/test/ui/typeck/issue-104513-ice.stderr
Normal file
18
src/test/ui/typeck/issue-104513-ice.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
error[E0405]: cannot find trait `Oops` in this scope
|
||||||
|
--> $DIR/issue-104513-ice.rs:3:19
|
||||||
|
|
|
||||||
|
LL | fn f() {
|
||||||
|
| - help: you might be missing a type parameter: `<Oops>`
|
||||||
|
LL | let _: S<impl Oops> = S;
|
||||||
|
| ^^^^ not found in this scope
|
||||||
|
|
||||||
|
error[E0562]: `impl Trait` only allowed in function and inherent method return types, not in variable binding
|
||||||
|
--> $DIR/issue-104513-ice.rs:3:14
|
||||||
|
|
|
||||||
|
LL | let _: S<impl Oops> = S;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0405, E0562.
|
||||||
|
For more information about an error, try `rustc --explain E0405`.
|
Loading…
Reference in a new issue