Fix rare ICE during typeck in rustdoc scrape_examples
This commit is contained in:
parent
fd5d614b77
commit
b8ecc9fefa
5 changed files with 28 additions and 2 deletions
|
@ -132,12 +132,28 @@ where
|
|||
fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) {
|
||||
intravisit::walk_expr(self, ex);
|
||||
|
||||
// Get type of function if expression is a function call
|
||||
let tcx = self.tcx;
|
||||
|
||||
// If we visit an item that contains an expression outside a function body,
|
||||
// then we need to exit before calling typeck (which will panic). See
|
||||
// test/run-make/rustdoc-scrape-examples-invalid-expr for an example.
|
||||
let hir = tcx.hir();
|
||||
let owner = hir.local_def_id_to_hir_id(ex.hir_id.owner);
|
||||
if hir.maybe_body_owned_by(owner).is_none() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get type of function if expression is a function call
|
||||
let (ty, span) = match ex.kind {
|
||||
hir::ExprKind::Call(f, _) => {
|
||||
let types = tcx.typeck(ex.hir_id.owner);
|
||||
(types.node_type(f.hir_id), ex.span)
|
||||
|
||||
match types.node_type_opt(f.hir_id) {
|
||||
Some(ty) => (ty, ex.span),
|
||||
None => {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
hir::ExprKind::MethodCall(_, _, _, span) => {
|
||||
let types = tcx.typeck(ex.hir_id.owner);
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
deps := ex
|
||||
|
||||
-include ../rustdoc-scrape-examples-multiple/scrape.mk
|
||||
|
||||
all: scrape
|
|
@ -0,0 +1,2 @@
|
|||
pub struct Foo([usize; foobar::f()]);
|
||||
fn main() {}
|
|
@ -0,0 +1 @@
|
|||
pub const fn f() -> usize { 5 }
|
|
@ -1,4 +1,6 @@
|
|||
// @has foobar/fn.ok.html '//*[@class="docblock scraped-example-list"]//*[@class="prev"]' ''
|
||||
// @has foobar/fn.ok.html '//*[@class="more-scraped-examples"]' ''
|
||||
// @has src/ex/ex.rs.html
|
||||
// @has foobar/fn.ok.html '//a[@href="../src/ex/ex.rs.html#2"]' ''
|
||||
|
||||
pub fn ok() {}
|
||||
|
|
Loading…
Add table
Reference in a new issue