about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2022-11-17 20:27:28 +0800
committeryukang <moorekang@gmail.com>2022-11-24 13:02:00 +0800
commitecea94e6a4ee5cd3615c934cfad54750af4df0cc (patch)
tree14ed94a95233b254477e7e9b1883b9a411323306
parentbebd57a9602e48431c90274fbf7d96683b0708b6 (diff)
downloadrust-ecea94e6a4ee5cd3615c934cfad54750af4df0cc.tar.gz
rust-ecea94e6a4ee5cd3615c934cfad54750af4df0cc.zip
fix #104513, Use node_ty_opt to avoid ICE in visit_ty
-rw-r--r--compiler/rustc_hir_typeck/src/writeback.rs9
-rw-r--r--src/test/ui/typeck/issue-104513-ice.rs6
-rw-r--r--src/test/ui/typeck/issue-104513-ice.stderr18
3 files changed, 30 insertions, 3 deletions
diff --git a/compiler/rustc_hir_typeck/src/writeback.rs b/compiler/rustc_hir_typeck/src/writeback.rs
index 1e26daa9c2c..9097525d726 100644
--- a/compiler/rustc_hir_typeck/src/writeback.rs
+++ b/compiler/rustc_hir_typeck/src/writeback.rs
@@ -363,9 +363,12 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
 
     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) {
diff --git a/src/test/ui/typeck/issue-104513-ice.rs b/src/test/ui/typeck/issue-104513-ice.rs
new file mode 100644
index 00000000000..bcac0fa1e70
--- /dev/null
+++ b/src/test/ui/typeck/issue-104513-ice.rs
@@ -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() {}
diff --git a/src/test/ui/typeck/issue-104513-ice.stderr b/src/test/ui/typeck/issue-104513-ice.stderr
new file mode 100644
index 00000000000..2b3b1b9efdf
--- /dev/null
+++ b/src/test/ui/typeck/issue-104513-ice.stderr
@@ -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`.