Skip to content

Commit

Permalink
fix rust-lang#104513, Delay a span bug if we see generic params with …
Browse files Browse the repository at this point in the history
…err during writeback
  • Loading branch information
chenyukang committed Nov 17, 2022
1 parent bebd57a commit 75915e8
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
14 changes: 14 additions & 0 deletions compiler/rustc_hir_typeck/src/writeback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,20 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
}
}

fn visit_generic_arg(&mut self, arg: &'tcx hir::GenericArg<'tcx>) {
match arg {
hir::GenericArg::Type(ty) if let hir::TyKind::Err = ty.kind => {
// An generic argument with an error type will be reported
// We don't want to ICE here
self.tcx().sess.delay_span_bug(ty.span, format!("unexpected generic argument: {arg:?}"));
}
hir::GenericArg::Type(t) => self.visit_ty(t),
_ => {
// Nothing to write back here
}
}
}

fn visit_block(&mut self, b: &'tcx hir::Block<'tcx>) {
self.visit_node_id(b.span, b.hir_id);
intravisit::walk_block(self, b);
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/typeck/issue-104513-ice.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions src/test/ui/typeck/issue-104513-ice.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 75915e8

Please sign in to comment.