1
Fork 0

Make THIR building a stealable query

This commit is contained in:
LeSeulArtichaut 2021-04-04 18:42:17 +02:00
parent bd80018159
commit 6f64eb1fe6
20 changed files with 60 additions and 42 deletions

View file

@ -14,6 +14,7 @@ macro_rules! arena_types {
[] layouts: rustc_target::abi::Layout, [] layouts: rustc_target::abi::Layout,
// AdtDef are interned and compared by address // AdtDef are interned and compared by address
[] adt_def: rustc_middle::ty::AdtDef, [] adt_def: rustc_middle::ty::AdtDef,
[] steal_thir: rustc_data_structures::steal::Steal<rustc_middle::thir::Thir<$tcx>>,
[] steal_mir: rustc_data_structures::steal::Steal<rustc_middle::mir::Body<$tcx>>, [] steal_mir: rustc_data_structures::steal::Steal<rustc_middle::mir::Body<$tcx>>,
[decode] mir: rustc_middle::mir::Body<$tcx>, [decode] mir: rustc_middle::mir::Body<$tcx>,
[] steal_promoted: [] steal_promoted:

View file

@ -285,7 +285,7 @@ pub type DepNode = rustc_query_system::dep_graph::DepNode<DepKind>;
// required that their size stay the same, but we don't want to change // required that their size stay the same, but we don't want to change
// it inadvertently. This assert just ensures we're aware of any change. // it inadvertently. This assert just ensures we're aware of any change.
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
static_assert_size!(DepNode, 17); static_assert_size!(DepNode, 18);
#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
static_assert_size!(DepNode, 24); static_assert_size!(DepNode, 24);

View file

@ -220,6 +220,11 @@ rustc_queries! {
desc { "checking if the crate is_panic_runtime" } desc { "checking if the crate is_panic_runtime" }
} }
/// Fetch the THIR for a given body.
query thir_body(key: ty::WithOptConstParam<LocalDefId>) -> (&'tcx Steal<thir::Thir<'tcx>>, thir::ExprId) {
desc { |tcx| "building THIR for `{}`", tcx.def_path_str(key.did.to_def_id()) }
}
/// Set of all the `DefId`s in this crate that have MIR associated with /// Set of all the `DefId`s in this crate that have MIR associated with
/// them. This includes all the body owners, but also things like struct /// them. This includes all the body owners, but also things like struct
/// constructors. /// constructors.

View file

@ -24,18 +24,21 @@ use std::fmt;
use std::ops::Index; use std::ops::Index;
newtype_index! { newtype_index! {
#[derive(HashStable)]
pub struct ArmId { pub struct ArmId {
DEBUG_FORMAT = "a{}" DEBUG_FORMAT = "a{}"
} }
} }
newtype_index! { newtype_index! {
#[derive(HashStable)]
pub struct ExprId { pub struct ExprId {
DEBUG_FORMAT = "e{}" DEBUG_FORMAT = "e{}"
} }
} }
newtype_index! { newtype_index! {
#[derive(HashStable)]
pub struct StmtId { pub struct StmtId {
DEBUG_FORMAT = "s{}" DEBUG_FORMAT = "s{}"
} }
@ -43,6 +46,7 @@ newtype_index! {
macro_rules! thir_with_elements { macro_rules! thir_with_elements {
($($name:ident: $id:ty => $value:ty,)*) => { ($($name:ident: $id:ty => $value:ty,)*) => {
#[derive(Debug, HashStable)]
pub struct Thir<'tcx> { pub struct Thir<'tcx> {
$( $(
pub $name: IndexVec<$id, $value>, pub $name: IndexVec<$id, $value>,
@ -76,13 +80,13 @@ thir_with_elements! {
stmts: StmtId => Stmt<'tcx>, stmts: StmtId => Stmt<'tcx>,
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug, HashStable)]
pub enum LintLevel { pub enum LintLevel {
Inherited, Inherited,
Explicit(hir::HirId), Explicit(hir::HirId),
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct Block { pub struct Block {
pub targeted_by_break: bool, pub targeted_by_break: bool,
pub region_scope: region::Scope, pub region_scope: region::Scope,
@ -93,7 +97,7 @@ pub struct Block {
pub safety_mode: BlockSafety, pub safety_mode: BlockSafety,
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug, HashStable)]
pub enum BlockSafety { pub enum BlockSafety {
Safe, Safe,
ExplicitUnsafe(hir::HirId), ExplicitUnsafe(hir::HirId),
@ -101,13 +105,13 @@ pub enum BlockSafety {
PopUnsafe, PopUnsafe,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct Stmt<'tcx> { pub struct Stmt<'tcx> {
pub kind: StmtKind<'tcx>, pub kind: StmtKind<'tcx>,
pub opt_destruction_scope: Option<region::Scope>, pub opt_destruction_scope: Option<region::Scope>,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub enum StmtKind<'tcx> { pub enum StmtKind<'tcx> {
Expr { Expr {
/// scope for this statement; may be used as lifetime of temporaries /// scope for this statement; may be used as lifetime of temporaries
@ -157,7 +161,7 @@ rustc_data_structures::static_assert_size!(Expr<'_>, 144);
/// MIR simplifications are already done in the impl of `Thir`. For /// MIR simplifications are already done in the impl of `Thir`. For
/// example, method calls and overloaded operators are absent: they are /// example, method calls and overloaded operators are absent: they are
/// expected to be converted into `Expr::Call` instances. /// expected to be converted into `Expr::Call` instances.
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct Expr<'tcx> { pub struct Expr<'tcx> {
/// type of this expression /// type of this expression
pub ty: Ty<'tcx>, pub ty: Ty<'tcx>,
@ -173,7 +177,7 @@ pub struct Expr<'tcx> {
pub kind: ExprKind<'tcx>, pub kind: ExprKind<'tcx>,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub enum ExprKind<'tcx> { pub enum ExprKind<'tcx> {
Scope { Scope {
region_scope: region::Scope, region_scope: region::Scope,
@ -363,19 +367,19 @@ pub enum ExprKind<'tcx> {
}, },
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct FieldExpr { pub struct FieldExpr {
pub name: Field, pub name: Field,
pub expr: ExprId, pub expr: ExprId,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct FruInfo<'tcx> { pub struct FruInfo<'tcx> {
pub base: ExprId, pub base: ExprId,
pub field_types: Box<[Ty<'tcx>]>, pub field_types: Box<[Ty<'tcx>]>,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub struct Arm<'tcx> { pub struct Arm<'tcx> {
pub pattern: Pat<'tcx>, pub pattern: Pat<'tcx>,
pub guard: Option<Guard<'tcx>>, pub guard: Option<Guard<'tcx>>,
@ -385,19 +389,19 @@ pub struct Arm<'tcx> {
pub span: Span, pub span: Span,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub enum Guard<'tcx> { pub enum Guard<'tcx> {
If(ExprId), If(ExprId),
IfLet(Pat<'tcx>, ExprId), IfLet(Pat<'tcx>, ExprId),
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug, HashStable)]
pub enum LogicalOp { pub enum LogicalOp {
And, And,
Or, Or,
} }
#[derive(Debug)] #[derive(Debug, HashStable)]
pub enum InlineAsmOperand<'tcx> { pub enum InlineAsmOperand<'tcx> {
In { In {
reg: InlineAsmRegOrRegClass, reg: InlineAsmRegOrRegClass,
@ -431,19 +435,19 @@ pub enum InlineAsmOperand<'tcx> {
}, },
} }
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub enum BindingMode { pub enum BindingMode {
ByValue, ByValue,
ByRef(BorrowKind), ByRef(BorrowKind),
} }
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq, HashStable)]
pub struct FieldPat<'tcx> { pub struct FieldPat<'tcx> {
pub field: Field, pub field: Field,
pub pattern: Pat<'tcx>, pub pattern: Pat<'tcx>,
} }
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq, HashStable)]
pub struct Pat<'tcx> { pub struct Pat<'tcx> {
pub ty: Ty<'tcx>, pub ty: Ty<'tcx>,
pub span: Span, pub span: Span,
@ -456,7 +460,7 @@ impl<'tcx> Pat<'tcx> {
} }
} }
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct PatTyProj<'tcx> { pub struct PatTyProj<'tcx> {
pub user_ty: CanonicalUserType<'tcx>, pub user_ty: CanonicalUserType<'tcx>,
} }
@ -483,7 +487,7 @@ impl<'tcx> PatTyProj<'tcx> {
} }
} }
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct Ascription<'tcx> { pub struct Ascription<'tcx> {
pub user_ty: PatTyProj<'tcx>, pub user_ty: PatTyProj<'tcx>,
/// Variance to use when relating the type `user_ty` to the **type of the value being /// Variance to use when relating the type `user_ty` to the **type of the value being
@ -508,7 +512,7 @@ pub struct Ascription<'tcx> {
pub user_ty_span: Span, pub user_ty_span: Span,
} }
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq, HashStable)]
pub enum PatKind<'tcx> { pub enum PatKind<'tcx> {
Wild, Wild,
@ -586,7 +590,7 @@ pub enum PatKind<'tcx> {
}, },
} }
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq, HashStable)]
pub struct PatRange<'tcx> { pub struct PatRange<'tcx> {
pub lo: &'tcx ty::Const<'tcx>, pub lo: &'tcx ty::Const<'tcx>,
pub hi: &'tcx ty::Const<'tcx>, pub hi: &'tcx ty::Const<'tcx>,

View file

@ -13,6 +13,7 @@ use crate::middle::resolve_lifetime::{self, LifetimeScopeForPath, ObjectLifetime
use crate::middle::stability; use crate::middle::stability;
use crate::mir::interpret::{self, Allocation, ConstValue, Scalar}; use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted}; use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
use crate::thir::Thir;
use crate::traits; use crate::traits;
use crate::ty::query::{self, OnDiskCache, TyCtxtAt}; use crate::ty::query::{self, OnDiskCache, TyCtxtAt};
use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts}; use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts};
@ -1041,6 +1042,10 @@ impl<'tcx> TyCtxt<'tcx> {
} }
} }
pub fn alloc_steal_thir(self, thir: Thir<'tcx>) -> &'tcx Steal<Thir<'tcx>> {
self.arena.alloc(Steal::new(thir))
}
pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> { pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
self.arena.alloc(Steal::new(mir)) self.arena.alloc(Steal::new(mir))
} }

View file

@ -18,6 +18,7 @@ use crate::mir::interpret::GlobalId;
use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput}; use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput};
use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult}; use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult};
use crate::mir::mono::CodegenUnit; use crate::mir::mono::CodegenUnit;
use crate::thir;
use crate::traits::query::{ use crate::traits::query::{
CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal,
CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal,

View file

@ -669,7 +669,7 @@ impl<'tcx> GeneratorSubsts<'tcx> {
} }
} }
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone, HashStable)]
pub enum UpvarSubsts<'tcx> { pub enum UpvarSubsts<'tcx> {
Closure(SubstsRef<'tcx>), Closure(SubstsRef<'tcx>),
Generator(SubstsRef<'tcx>), Generator(SubstsRef<'tcx>),

View file

@ -1,8 +1,8 @@
use crate::build::matches::ArmHasGuard; use crate::build::matches::ArmHasGuard;
use crate::build::ForGuard::OutsideGuard; use crate::build::ForGuard::OutsideGuard;
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN; use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN;
use rustc_session::lint::Level; use rustc_session::lint::Level;
use rustc_span::Span; use rustc_span::Span;

View file

@ -1,8 +1,8 @@
//! See docs in build/expr/mod.rs //! See docs in build/expr/mod.rs
use crate::build::Builder; use crate::build::Builder;
use rustc_middle::thir::*;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::CanonicalUserTypeAnnotation; use rustc_middle::ty::CanonicalUserTypeAnnotation;
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {

View file

@ -2,9 +2,9 @@
use crate::build::expr::category::Category; use crate::build::expr::category::Category;
use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Returns an operand suitable for use until the end of the current /// Returns an operand suitable for use until the end of the current

View file

@ -3,13 +3,13 @@
use crate::build::expr::category::Category; use crate::build::expr::category::Category;
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard}; use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_hir::HirId; use rustc_hir::HirId;
use rustc_middle::hir::place::ProjectionKind as HirProjectionKind; use rustc_middle::hir::place::ProjectionKind as HirProjectionKind;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::AssertKind::BoundsCheck; use rustc_middle::mir::AssertKind::BoundsCheck;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::AdtDef; use rustc_middle::ty::AdtDef;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance}; use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance};
use rustc_span::Span; use rustc_span::Span;

View file

@ -5,11 +5,11 @@ use rustc_index::vec::Idx;
use crate::build::expr::as_place::PlaceBase; use crate::build::expr::as_place::PlaceBase;
use crate::build::expr::category::{Category, RvalueFunc}; use crate::build::expr::category::{Category, RvalueFunc};
use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::AssertKind; use rustc_middle::mir::AssertKind;
use rustc_middle::mir::Place; use rustc_middle::mir::Place;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::{self, Ty, UpvarSubsts}; use rustc_middle::ty::{self, Ty, UpvarSubsts};
use rustc_span::Span; use rustc_span::Span;

View file

@ -2,10 +2,10 @@
use crate::build::scope::DropKind; use crate::build::scope::DropKind;
use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{BlockAnd, BlockAndExtension, Builder};
use rustc_middle::thir::*;
use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Compile `expr` into a fresh temporary. This is used when building /// Compile `expr` into a fresh temporary. This is used when building

View file

@ -2,13 +2,13 @@
use crate::build::expr::category::{Category, RvalueFunc}; use crate::build::expr::category::{Category, RvalueFunc};
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_ast::InlineAsmOptions; use rustc_ast::InlineAsmOptions;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_index::vec::Idx; use rustc_index::vec::Idx;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation}; use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
use std::iter; use std::iter;

View file

@ -1,8 +1,8 @@
use crate::build::scope::BreakableTarget; use crate::build::scope::BreakableTarget;
use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder};
use rustc_middle::thir::*;
use rustc_middle::middle::region; use rustc_middle::middle::region;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::thir::*;
impl<'a, 'tcx> Builder<'a, 'tcx> { impl<'a, 'tcx> Builder<'a, 'tcx> {
/// Builds a block of MIR statements to evaluate the THIR `expr`. /// Builds a block of MIR statements to evaluate the THIR `expr`.

View file

@ -1,7 +1,6 @@
use crate::build; use crate::build;
use crate::build::expr::as_place::PlaceBuilder; use crate::build::expr::as_place::PlaceBuilder;
use crate::build::scope::DropKind; use crate::build::scope::DropKind;
use crate::thir::build_thir;
use crate::thir::pattern::pat_from_hir; use crate::thir::pattern::pat_from_hir;
use rustc_attr::{self as attr, UnwindAttr}; use rustc_attr::{self as attr, UnwindAttr};
use rustc_errors::ErrorReported; use rustc_errors::ErrorReported;
@ -106,7 +105,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
}; };
let body = tcx.hir().body(body_id); let body = tcx.hir().body(body_id);
let (thir, expr) = build_thir(tcx, def, &body.value); let (thir, expr) = tcx.thir_body(def);
let thir = thir.steal();
let ty = tcx.type_of(fn_def_id); let ty = tcx.type_of(fn_def_id);
let mut abi = fn_sig.abi; let mut abi = fn_sig.abi;
let implicit_argument = match ty.kind() { let implicit_argument = match ty.kind() {
@ -214,8 +214,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
let return_ty = typeck_results.node_type(id); let return_ty = typeck_results.node_type(id);
let ast_expr = &tcx.hir().body(body_id).value; let (thir, expr) = tcx.thir_body(def);
let (thir, expr) = build_thir(tcx, def, ast_expr); let thir = thir.steal();
build::construct_const(&thir, &infcx, expr, def, id, return_ty, return_ty_span) build::construct_const(&thir, &infcx, expr, def, id, return_ty, return_ty_span)
}; };

View file

@ -31,4 +31,5 @@ pub fn provide(providers: &mut Providers) {
providers.mir_built = build::mir_built; providers.mir_built = build::mir_built;
providers.thir_check_unsafety = check_unsafety::thir_check_unsafety; providers.thir_check_unsafety = check_unsafety::thir_check_unsafety;
providers.thir_check_unsafety_for_const_arg = check_unsafety::thir_check_unsafety_for_const_arg; providers.thir_check_unsafety_for_const_arg = check_unsafety::thir_check_unsafety_for_const_arg;
providers.thir_body = thir::cx::thir_body;
} }

View file

@ -2,10 +2,11 @@
//! structures into the THIR. The `builder` is generally ignorant of the tcx, //! structures into the THIR. The `builder` is generally ignorant of the tcx,
//! etc., and instead goes through the `Cx` for most of its work. //! etc., and instead goes through the `Cx` for most of its work.
use crate::thir::util::UserAnnotatedTyHelpers;
use crate::thir::pattern::pat_from_hir; use crate::thir::pattern::pat_from_hir;
use crate::thir::util::UserAnnotatedTyHelpers;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_data_structures::steal::Steal;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::Node; use rustc_hir::Node;
@ -15,14 +16,15 @@ use rustc_middle::thir::*;
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::Span; use rustc_span::Span;
pub fn build_thir<'tcx>( crate fn thir_body<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
owner_def: ty::WithOptConstParam<LocalDefId>, owner_def: ty::WithOptConstParam<LocalDefId>,
expr: &'tcx hir::Expr<'tcx>, ) -> (&'tcx Steal<Thir<'tcx>>, ExprId) {
) -> (Thir<'tcx>, ExprId) { let hir = tcx.hir();
let body = hir.body(hir.body_owned_by(hir.local_def_id_to_hir_id(owner_def.did)));
let mut cx = Cx::new(tcx, owner_def); let mut cx = Cx::new(tcx, owner_def);
let expr = cx.mirror_expr(expr); let expr = cx.mirror_expr(&body.value);
(cx.thir, expr) (tcx.alloc_steal_thir(cx.thir), expr)
} }
struct Cx<'tcx> { struct Cx<'tcx> {

View file

@ -7,7 +7,6 @@
crate mod constant; crate mod constant;
crate mod cx; crate mod cx;
pub use cx::build_thir;
crate mod pattern; crate mod pattern;

View file

@ -292,8 +292,8 @@ use rustc_data_structures::fx::FxHashMap;
use rustc_arena::TypedArena; use rustc_arena::TypedArena;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_hir::HirId; use rustc_hir::HirId;
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::thir::{Pat, PatKind}; use rustc_middle::thir::{Pat, PatKind};
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::Span; use rustc_span::Span;
use smallvec::{smallvec, SmallVec}; use smallvec::{smallvec, SmallVec};