mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
No need to distinguish LocalTy from Ty
This commit is contained in:
parent
8aed93d912
commit
91bc3f0ff6
@ -2,7 +2,7 @@ use crate::callee::{self, DeferredCallResolution};
|
|||||||
use crate::errors::CtorIsPrivate;
|
use crate::errors::CtorIsPrivate;
|
||||||
use crate::method::{self, MethodCallee, SelfSource};
|
use crate::method::{self, MethodCallee, SelfSource};
|
||||||
use crate::rvalue_scopes;
|
use crate::rvalue_scopes;
|
||||||
use crate::{BreakableCtxt, Diverges, Expectation, FnCtxt, LocalTy, RawTy};
|
use crate::{BreakableCtxt, Diverges, Expectation, FnCtxt, RawTy};
|
||||||
use rustc_data_structures::captures::Captures;
|
use rustc_data_structures::captures::Captures;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{Applicability, Diagnostic, ErrorGuaranteed, MultiSpan, StashKey};
|
use rustc_errors::{Applicability, Diagnostic, ErrorGuaranteed, MultiSpan, StashKey};
|
||||||
@ -135,7 +135,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
format!("{:p}", self)
|
format!("{:p}", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
|
pub fn local_ty(&self, span: Span, nid: hir::HirId) -> Ty<'tcx> {
|
||||||
self.locals.borrow().get(&nid).cloned().unwrap_or_else(|| {
|
self.locals.borrow().get(&nid).cloned().unwrap_or_else(|| {
|
||||||
span_bug!(span, "no type for local variable {}", self.tcx.hir().node_to_string(nid))
|
span_bug!(span, "no type for local variable {}", self.tcx.hir().node_to_string(nid))
|
||||||
})
|
})
|
||||||
@ -1152,7 +1152,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if let Res::Local(hid) = res {
|
if let Res::Local(hid) = res {
|
||||||
let ty = self.local_ty(span, hid).decl_ty;
|
let ty = self.local_ty(span, hid);
|
||||||
let ty = self.normalize(span, ty);
|
let ty = self.normalize(span, ty);
|
||||||
self.write_ty(hir_id, ty);
|
self.write_ty(hir_id, ty);
|
||||||
return (ty, res);
|
return (ty, res);
|
||||||
|
@ -6,8 +6,7 @@ use crate::method::MethodCallee;
|
|||||||
use crate::TupleArgumentsFlag::*;
|
use crate::TupleArgumentsFlag::*;
|
||||||
use crate::{errors, Expectation::*};
|
use crate::{errors, Expectation::*};
|
||||||
use crate::{
|
use crate::{
|
||||||
struct_span_err, BreakableCtxt, Diverges, Expectation, FnCtxt, LocalTy, Needs, RawTy,
|
struct_span_err, BreakableCtxt, Diverges, Expectation, FnCtxt, Needs, RawTy, TupleArgumentsFlag,
|
||||||
TupleArgumentsFlag,
|
|
||||||
};
|
};
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
@ -1423,7 +1422,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
// See #44848.
|
// See #44848.
|
||||||
let ref_bindings = pat.contains_explicit_ref_binding();
|
let ref_bindings = pat.contains_explicit_ref_binding();
|
||||||
|
|
||||||
let local_ty = self.local_ty(init.span, hir_id).revealed_ty;
|
let local_ty = self.local_ty(init.span, hir_id);
|
||||||
if let Some(m) = ref_bindings {
|
if let Some(m) = ref_bindings {
|
||||||
// Somewhat subtle: if we have a `ref` binding in the pattern,
|
// Somewhat subtle: if we have a `ref` binding in the pattern,
|
||||||
// we want to avoid introducing coercions for the RHS. This is
|
// we want to avoid introducing coercions for the RHS. This is
|
||||||
@ -1453,7 +1452,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
pub(in super::super) fn check_decl(&self, decl: Declaration<'tcx>) {
|
pub(in super::super) fn check_decl(&self, decl: Declaration<'tcx>) {
|
||||||
// Determine and write the type which we'll check the pattern against.
|
// Determine and write the type which we'll check the pattern against.
|
||||||
let decl_ty = self.local_ty(decl.span, decl.hir_id).decl_ty;
|
let decl_ty = self.local_ty(decl.span, decl.hir_id);
|
||||||
self.write_ty(decl.hir_id, decl_ty);
|
self.write_ty(decl.hir_id, decl_ty);
|
||||||
|
|
||||||
// Type check the initializer.
|
// Type check the initializer.
|
||||||
@ -1799,9 +1798,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
let err = self.tcx.ty_error(guar);
|
let err = self.tcx.ty_error(guar);
|
||||||
self.write_ty(hir_id, err);
|
self.write_ty(hir_id, err);
|
||||||
self.write_ty(pat.hir_id, err);
|
self.write_ty(pat.hir_id, err);
|
||||||
let local_ty = LocalTy { decl_ty: err, revealed_ty: err };
|
self.locals.borrow_mut().insert(hir_id, err);
|
||||||
self.locals.borrow_mut().insert(hir_id, local_ty);
|
self.locals.borrow_mut().insert(pat.hir_id, err);
|
||||||
self.locals.borrow_mut().insert(pat.hir_id, local_ty);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::{FnCtxt, LocalTy};
|
use crate::FnCtxt;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::PatKind;
|
use rustc_hir::PatKind;
|
||||||
@ -48,7 +48,7 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
|||||||
Self { fcx, outermost_fn_param_pat: None }
|
Self { fcx, outermost_fn_param_pat: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> {
|
fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<Ty<'tcx>>) -> Ty<'tcx> {
|
||||||
match ty_opt {
|
match ty_opt {
|
||||||
None => {
|
None => {
|
||||||
// Infer the variable's type.
|
// Infer the variable's type.
|
||||||
@ -56,23 +56,20 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
|||||||
kind: TypeVariableOriginKind::TypeInference,
|
kind: TypeVariableOriginKind::TypeInference,
|
||||||
span,
|
span,
|
||||||
});
|
});
|
||||||
self.fcx
|
self.fcx.locals.borrow_mut().insert(nid, var_ty);
|
||||||
.locals
|
|
||||||
.borrow_mut()
|
|
||||||
.insert(nid, LocalTy { decl_ty: var_ty, revealed_ty: var_ty });
|
|
||||||
var_ty
|
var_ty
|
||||||
}
|
}
|
||||||
Some(typ) => {
|
Some(typ) => {
|
||||||
// Take type that the user specified.
|
// Take type that the user specified.
|
||||||
self.fcx.locals.borrow_mut().insert(nid, typ);
|
self.fcx.locals.borrow_mut().insert(nid, typ);
|
||||||
typ.revealed_ty
|
typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allocates a [LocalTy] for a declaration, which may have a type annotation. If it does have
|
/// Allocates a type for a declaration, which may have a type annotation. If it does have
|
||||||
/// a type annotation, then the LocalTy stored will be the resolved type. This may be found
|
/// a type annotation, then the [`Ty`] stored will be the resolved type. This may be found
|
||||||
/// again during type checking by querying [FnCtxt::local_ty] for the same hir_id.
|
/// again during type checking by querying [`FnCtxt::local_ty`] for the same hir_id.
|
||||||
fn declare(&mut self, decl: Declaration<'tcx>) {
|
fn declare(&mut self, decl: Declaration<'tcx>) {
|
||||||
let local_ty = match decl.ty {
|
let local_ty = match decl.ty {
|
||||||
Some(ref ty) => {
|
Some(ref ty) => {
|
||||||
@ -87,7 +84,7 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
|||||||
.user_provided_types_mut()
|
.user_provided_types_mut()
|
||||||
.insert(ty.hir_id, c_ty);
|
.insert(ty.hir_id, c_ty);
|
||||||
|
|
||||||
Some(LocalTy { decl_ty: o_ty.normalized, revealed_ty: o_ty.normalized })
|
Some(o_ty.normalized)
|
||||||
}
|
}
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
@ -96,7 +93,7 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
|
|||||||
debug!(
|
debug!(
|
||||||
"local variable {:?} is assigned type {}",
|
"local variable {:?} is assigned type {}",
|
||||||
decl.pat,
|
decl.pat,
|
||||||
self.fcx.ty_to_string(self.fcx.locals.borrow().get(&decl.hir_id).unwrap().decl_ty)
|
self.fcx.ty_to_string(*self.fcx.locals.borrow().get(&decl.hir_id).unwrap())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,7 +148,7 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> {
|
|||||||
debug!(
|
debug!(
|
||||||
"pattern binding {} is assigned to {} with type {:?}",
|
"pattern binding {} is assigned to {} with type {:?}",
|
||||||
ident,
|
ident,
|
||||||
self.fcx.ty_to_string(self.fcx.locals.borrow().get(&p.hir_id).unwrap().decl_ty),
|
self.fcx.ty_to_string(*self.fcx.locals.borrow().get(&p.hir_id).unwrap()),
|
||||||
var_ty
|
var_ty
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ pub struct Inherited<'tcx> {
|
|||||||
|
|
||||||
pub(super) typeck_results: RefCell<ty::TypeckResults<'tcx>>,
|
pub(super) typeck_results: RefCell<ty::TypeckResults<'tcx>>,
|
||||||
|
|
||||||
pub(super) locals: RefCell<HirIdMap<super::LocalTy<'tcx>>>,
|
pub(super) locals: RefCell<HirIdMap<Ty<'tcx>>>,
|
||||||
|
|
||||||
pub(super) fulfillment_cx: RefCell<Box<dyn TraitEngine<'tcx>>>,
|
pub(super) fulfillment_cx: RefCell<Box<dyn TraitEngine<'tcx>>>,
|
||||||
|
|
||||||
|
@ -89,13 +89,6 @@ macro_rules! type_error_struct {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The type of a local binding, including the revealed type for anon types.
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
|
||||||
pub struct LocalTy<'tcx> {
|
|
||||||
decl_ty: Ty<'tcx>,
|
|
||||||
revealed_ty: Ty<'tcx>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// If this `DefId` is a "primary tables entry", returns
|
/// If this `DefId` is a "primary tables entry", returns
|
||||||
/// `Some((body_id, body_ty, fn_sig))`. Otherwise, returns `None`.
|
/// `Some((body_id, body_ty, fn_sig))`. Otherwise, returns `None`.
|
||||||
///
|
///
|
||||||
|
@ -594,7 +594,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
debug!("check_pat_ident: pat.hir_id={:?} bm={:?}", pat.hir_id, bm);
|
debug!("check_pat_ident: pat.hir_id={:?} bm={:?}", pat.hir_id, bm);
|
||||||
|
|
||||||
let local_ty = self.local_ty(pat.span, pat.hir_id).decl_ty;
|
let local_ty = self.local_ty(pat.span, pat.hir_id);
|
||||||
let eq_ty = match bm {
|
let eq_ty = match bm {
|
||||||
ty::BindByReference(mutbl) => {
|
ty::BindByReference(mutbl) => {
|
||||||
// If the binding is like `ref x | ref mut x`,
|
// If the binding is like `ref x | ref mut x`,
|
||||||
@ -635,7 +635,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
ti: TopInfo<'tcx>,
|
ti: TopInfo<'tcx>,
|
||||||
) {
|
) {
|
||||||
let var_ty = self.local_ty(span, var_id).decl_ty;
|
let var_ty = self.local_ty(span, var_id);
|
||||||
if let Some(mut err) = self.demand_eqtype_pat_diag(span, var_ty, ty, ti) {
|
if let Some(mut err) = self.demand_eqtype_pat_diag(span, var_ty, ty, ti) {
|
||||||
let hir = self.tcx.hir();
|
let hir = self.tcx.hir();
|
||||||
let var_ty = self.resolve_vars_with_obligations(var_ty);
|
let var_ty = self.resolve_vars_with_obligations(var_ty);
|
||||||
|
@ -348,7 +348,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
|
|||||||
|
|
||||||
fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) {
|
fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) {
|
||||||
intravisit::walk_local(self, l);
|
intravisit::walk_local(self, l);
|
||||||
let var_ty = self.fcx.local_ty(l.span, l.hir_id).decl_ty;
|
let var_ty = self.fcx.local_ty(l.span, l.hir_id);
|
||||||
let var_ty = self.resolve(var_ty, &l.span);
|
let var_ty = self.resolve(var_ty, &l.span);
|
||||||
self.write_ty_to_typeck_results(l.hir_id, var_ty);
|
self.write_ty_to_typeck_results(l.hir_id, var_ty);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user