Fix ICE with -Zunpretty=hir,typed
when an expression occurs in a function signature
This commit is contained in:
parent
481971978f
commit
7682e87c6d
@ -293,18 +293,6 @@ struct TypedAnnotation<'tcx> {
|
|||||||
maybe_typeck_results: Cell<Option<&'tcx ty::TypeckResults<'tcx>>>,
|
maybe_typeck_results: Cell<Option<&'tcx ty::TypeckResults<'tcx>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypedAnnotation<'tcx> {
|
|
||||||
/// Gets the type-checking results for the current body.
|
|
||||||
/// As this will ICE if called outside bodies, only call when working with
|
|
||||||
/// `Expr` or `Pat` nodes (they are guaranteed to be found only in bodies).
|
|
||||||
#[track_caller]
|
|
||||||
fn typeck_results(&self) -> &'tcx ty::TypeckResults<'tcx> {
|
|
||||||
self.maybe_typeck_results
|
|
||||||
.get()
|
|
||||||
.expect("`TypedAnnotation::typeck_results` called outside of body")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> HirPrinterSupport<'tcx> for TypedAnnotation<'tcx> {
|
impl<'tcx> HirPrinterSupport<'tcx> for TypedAnnotation<'tcx> {
|
||||||
fn sess(&self) -> &Session {
|
fn sess(&self) -> &Session {
|
||||||
&self.tcx.sess
|
&self.tcx.sess
|
||||||
@ -336,10 +324,24 @@ fn pre(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) {
|
|||||||
}
|
}
|
||||||
fn post(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) {
|
fn post(&self, s: &mut pprust_hir::State<'_>, node: pprust_hir::AnnNode<'_>) {
|
||||||
if let pprust_hir::AnnNode::Expr(expr) = node {
|
if let pprust_hir::AnnNode::Expr(expr) = node {
|
||||||
s.s.space();
|
let typeck_results =
|
||||||
s.s.word("as");
|
self.maybe_typeck_results.get().or_else(|| {
|
||||||
s.s.space();
|
if let Some(body_id) = self.tcx.hir().maybe_body_owned_by(
|
||||||
s.s.word(self.typeck_results().expr_ty(expr).to_string());
|
self.tcx.hir().local_def_id_to_hir_id(expr.hir_id.owner),
|
||||||
|
) {
|
||||||
|
Some(self.tcx.typeck_body(body_id))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(typeck_results) = typeck_results {
|
||||||
|
s.s.space();
|
||||||
|
s.s.word("as");
|
||||||
|
s.s.space();
|
||||||
|
s.s.word(typeck_results.expr_ty(expr).to_string());
|
||||||
|
}
|
||||||
|
|
||||||
s.pclose();
|
s.pclose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
src/test/ui/unpretty-expr-fn-arg.rs
Normal file
13
src/test/ui/unpretty-expr-fn-arg.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Regression test for the ICE described in #82328. The pretty-printer for
|
||||||
|
// compile-flags: -Zunpretty=hir,typed
|
||||||
|
// would previously retrieve type-checking results when entering a body,
|
||||||
|
// which means that type information was not available for expressions
|
||||||
|
// occurring in function signatures, as in the `foo` example below, leading
|
||||||
|
// to an ICE.
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
|
||||||
|
fn foo(-128..=127: i8) {}
|
17
src/test/ui/unpretty-expr-fn-arg.stdout
Normal file
17
src/test/ui/unpretty-expr-fn-arg.stdout
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Regression test for the ICE described in #82328. The pretty-printer for
|
||||||
|
// compile-flags: -Zunpretty=hir,typed
|
||||||
|
// would previously retrieve type-checking results when entering a body,
|
||||||
|
// which means that type information was not available for expressions
|
||||||
|
// occurring in function signatures, as in the `foo` example below, leading
|
||||||
|
// to an ICE.
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
#![allow(dead_code)]
|
||||||
|
#[prelude_import]
|
||||||
|
use ::std::prelude::rust_2015::*;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate std;
|
||||||
|
|
||||||
|
fn main() ({ } as ())
|
||||||
|
|
||||||
|
fn foo((-(128 as i8) as i8) ...(127 as i8): i8) ({ } as ())
|
Loading…
Reference in New Issue
Block a user