fn visit_ty(&mut self, hir_ty: &'tcx hir::Ty<'tcx>) {
intravisit::walk_ty(self, hir_ty);
- let ty = self.fcx.node_ty(hir_ty.hir_id);
- let ty = self.resolve(ty, &hir_ty.span);
- self.write_ty_to_typeck_results(hir_ty.hir_id, ty);
+ // If there are type checking errors, Type privacy pass will stop,
+ // so we may not get the type from hid_id, see #104513
+ 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) {
--- /dev/null
+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() {}
--- /dev/null
+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`.