提交 8d9f4a12 编写于 作者: E Eduard-Mihai Burtescu

rustc: rename all occurences of "freevar" to "upvar".

上级 125dc60d
......@@ -140,7 +140,7 @@ pub enum Res<Id = hir::HirId> {
SelfCtor(DefId /* impl */), // `DefId` refers to the impl
Local(Id),
Upvar(Id, // `HirId` of closed over local
usize, // index in the `freevars` list of the closure
usize, // index in the `upvars` list of the closure
ast::NodeId), // expr node that creates the closure
// Macro namespace
......
......@@ -2476,19 +2476,19 @@ pub fn descriptive_variant(&self) -> &str {
}
}
/// A free variable referred to in a function.
/// A variable captured by a closure.
#[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable)]
pub struct Freevar<Id = HirId> {
/// The variable being accessed free.
pub struct Upvar<Id = HirId> {
/// The variable being captured.
pub res: Res<Id>,
// First span where it is accessed (there can be multiple).
pub span: Span
}
impl<Id: fmt::Debug + Copy> Freevar<Id> {
pub fn map_id<R>(self, map: impl FnMut(Id) -> R) -> Freevar<R> {
Freevar {
impl<Id: fmt::Debug + Copy> Upvar<Id> {
pub fn map_id<R>(self, map: impl FnMut(Id) -> R) -> Upvar<R> {
Upvar {
res: self.res.map_id(map),
span: self.span,
}
......@@ -2497,12 +2497,12 @@ pub fn map_id<R>(self, map: impl FnMut(Id) -> R) -> Freevar<R> {
pub fn var_id(&self) -> Id {
match self.res {
Res::Local(id) | Res::Upvar(id, ..) => id,
_ => bug!("Freevar::var_id: bad res ({:?})", self.res)
_ => bug!("Upvar::var_id: bad res ({:?})", self.res)
}
}
}
pub type FreevarMap = NodeMap<Vec<Freevar<ast::NodeId>>>;
pub type UpvarMap = NodeMap<Vec<Upvar<ast::NodeId>>>;
pub type CaptureModeMap = NodeMap<CaptureClause>;
......
......@@ -46,7 +46,7 @@ pub(super) fn note_region_origin(&self,
err.span_note(span,
"...so that pointer is not dereferenced outside its lifetime");
}
infer::FreeVariable(span, id) => {
infer::ClosureCapture(span, id) => {
err.span_note(span,
&format!("...so that captured variable `{}` does not outlive the \
enclosing closure",
......@@ -214,7 +214,7 @@ pub(super) fn report_concrete_failure(&self,
"the reference is only valid for ", sup, "");
err
}
infer::FreeVariable(span, id) => {
infer::ClosureCapture(span, id) => {
let mut err = struct_span_err!(self.tcx.sess,
span,
E0474,
......
......@@ -264,8 +264,8 @@ pub enum SubregionOrigin<'tcx> {
/// Dereference of reference must be within its lifetime
DerefPointer(Span),
/// Closure bound must not outlive captured free variables
FreeVariable(Span, ast::NodeId),
/// Closure bound must not outlive captured variables
ClosureCapture(Span, ast::NodeId),
/// Index into slice must be within its lifetime
IndexSlice(Span),
......@@ -1660,7 +1660,7 @@ pub fn span(&self) -> Span {
InfStackClosure(a) => a,
InvokeClosure(a) => a,
DerefPointer(a) => a,
FreeVariable(a, _) => a,
ClosureCapture(a, _) => a,
IndexSlice(a) => a,
RelateObjectBound(a) => a,
RelateParamBound(a, _) => a,
......
......@@ -931,9 +931,9 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
debug!("walk_captures({:?})", closure_expr);
let closure_def_id = self.tcx().hir().local_def_id_from_hir_id(closure_expr.hir_id);
if let Some(freevars) = self.tcx().freevars(closure_def_id) {
for freevar in freevars.iter() {
let var_hir_id = freevar.var_id();
if let Some(upvars) = self.tcx().upvars(closure_def_id) {
for upvar in upvars.iter() {
let var_hir_id = upvar.var_id();
let upvar_id = ty::UpvarId {
var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: closure_def_id.to_local(),
......@@ -941,14 +941,14 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
let upvar_capture = self.mc.tables.upvar_capture(upvar_id);
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.hir_id,
fn_decl_span,
freevar));
upvar));
match upvar_capture {
ty::UpvarCapture::ByValue => {
let mode = copy_or_move(&self.mc,
self.param_env,
&cmt_var,
CaptureMove);
self.delegate.consume(closure_expr.hir_id, freevar.span, &cmt_var, mode);
self.delegate.consume(closure_expr.hir_id, upvar.span, &cmt_var, mode);
}
ty::UpvarCapture::ByRef(upvar_borrow) => {
self.delegate.borrow(closure_expr.hir_id,
......@@ -956,7 +956,7 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
&cmt_var,
upvar_borrow.region,
upvar_borrow.kind,
ClosureCapture(freevar.span));
ClosureCapture(upvar.span));
}
}
}
......@@ -966,7 +966,7 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
fn cat_captured_var(&mut self,
closure_hir_id: hir::HirId,
closure_span: Span,
upvar: &hir::Freevar)
upvar: &hir::Upvar)
-> mc::McResult<mc::cmt_<'tcx>> {
// Create the cmt for the variable being borrowed, from the
// caller's perspective
......
......@@ -144,7 +144,7 @@ fn get(&self) -> usize { self.0 as usize }
#[derive(Copy, Clone, PartialEq, Debug)]
enum LiveNodeKind {
FreeVarNode(Span),
UpvarNode(Span),
ExprNode(Span),
VarDefNode(Span),
ExitNode
......@@ -153,8 +153,8 @@ enum LiveNodeKind {
fn live_node_kind_to_string(lnk: LiveNodeKind, tcx: TyCtxt<'_, '_, '_>) -> String {
let cm = tcx.sess.source_map();
match lnk {
FreeVarNode(s) => {
format!("Free var node [{}]", cm.span_to_string(s))
UpvarNode(s) => {
format!("Upvar node [{}]", cm.span_to_string(s))
}
ExprNode(s) => {
format!("Expr node [{}]", cm.span_to_string(s))
......@@ -484,11 +484,11 @@ fn visit_expr<'a, 'tcx>(ir: &mut IrMaps<'a, 'tcx>, expr: &'tcx Expr) {
// construction site.
let mut call_caps = Vec::new();
let closure_def_id = ir.tcx.hir().local_def_id_from_hir_id(expr.hir_id);
if let Some(freevars) = ir.tcx.freevars(closure_def_id) {
call_caps.extend(freevars.iter().filter_map(|freevar| {
if let Res::Local(rv) = freevar.res {
let freevar_ln = ir.add_live_node(FreeVarNode(freevar.span));
Some(CaptureInfo { ln: freevar_ln, var_hid: rv })
if let Some(upvars) = ir.tcx.upvars(closure_def_id) {
call_caps.extend(upvars.iter().filter_map(|upvar| {
if let Res::Local(rv) = upvar.res {
let upvar_ln = ir.add_live_node(UpvarNode(upvar.span));
Some(CaptureInfo { ln: upvar_ln, var_hid: rv })
} else {
None
}
......
......@@ -2572,9 +2572,9 @@ fn fmt_tuple(fmt: &mut Formatter<'_>, places: &[Operand<'_>]) -> fmt::Result {
};
let mut struct_fmt = fmt.debug_struct(&name);
if let Some(freevars) = tcx.freevars(def_id) {
for (freevar, place) in freevars.iter().zip(places) {
let var_name = tcx.hir().name_by_hir_id(freevar.var_id());
if let Some(upvars) = tcx.upvars(def_id) {
for (upvar, place) in upvars.iter().zip(places) {
let var_name = tcx.hir().name_by_hir_id(upvar.var_id());
struct_fmt.field(&var_name.as_str(), place);
}
}
......@@ -2591,9 +2591,9 @@ fn fmt_tuple(fmt: &mut Formatter<'_>, places: &[Operand<'_>]) -> fmt::Result {
tcx.hir().span_by_hir_id(hir_id));
let mut struct_fmt = fmt.debug_struct(&name);
if let Some(freevars) = tcx.freevars(def_id) {
for (freevar, place) in freevars.iter().zip(places) {
let var_name = tcx.hir().name_by_hir_id(freevar.var_id());
if let Some(upvars) = tcx.upvars(def_id) {
for (upvar, place) in upvars.iter().zip(places) {
let var_name = tcx.hir().name_by_hir_id(upvar.var_id());
struct_fmt.field(&var_name.as_str(), place);
}
}
......
......@@ -824,7 +824,7 @@
desc { "generating a postorder list of CrateNums" }
}
query freevars(_: DefId) -> Option<Lrc<Vec<hir::Freevar>>> {
query upvars(_: DefId) -> Option<Lrc<Vec<hir::Upvar>>> {
eval_always
}
query maybe_unused_trait_import(_: DefId) -> bool {
......
......@@ -1071,10 +1071,10 @@ pub struct GlobalCtxt<'tcx> {
pub queries: query::Queries<'tcx>,
// Records the free variables referenced by every closure
// Records the captured variables referenced by every closure
// expression. Do not track deps for this, just recompute it from
// scratch every time.
freevars: FxHashMap<DefId, Lrc<Vec<hir::Freevar>>>,
upvars: FxHashMap<DefId, Lrc<Vec<hir::Upvar>>>,
maybe_unused_trait_imports: FxHashSet<DefId>,
maybe_unused_extern_crates: Vec<(DefId, Span)>,
......@@ -1317,7 +1317,7 @@ pub fn create_global_ctxt(
}).collect();
(k, Lrc::new(exports))
}).collect(),
freevars: resolutions.freevars.into_iter().map(|(k, v)| {
upvars: resolutions.upvars.into_iter().map(|(k, v)| {
let vars: Vec<_> = v.into_iter().map(|e| {
e.map_id(|id| hir.node_to_hir_id(id))
}).collect();
......@@ -3055,7 +3055,7 @@ pub fn provide(providers: &mut ty::query::Providers<'_>) {
assert_eq!(id, LOCAL_CRATE);
Lrc::new(middle::lang_items::collect(tcx))
};
providers.freevars = |tcx, id| tcx.gcx.freevars.get(&id).cloned();
providers.upvars = |tcx, id| tcx.gcx.upvars.get(&id).cloned();
providers.maybe_unused_trait_import = |tcx, id| {
tcx.maybe_unused_trait_imports.contains(&id)
};
......
......@@ -8,7 +8,7 @@
pub use self::IntVarValue::*;
pub use self::fold::TypeFoldable;
use crate::hir::{map as hir_map, FreevarMap, GlobMap, TraitMap};
use crate::hir::{map as hir_map, UpvarMap, GlobMap, TraitMap};
use crate::hir::Node;
use crate::hir::def::{Res, DefKind, CtorOf, CtorKind, ExportMap};
use crate::hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
......@@ -122,7 +122,7 @@
#[derive(Clone)]
pub struct Resolutions {
pub freevars: FreevarMap,
pub upvars: UpvarMap,
pub trait_map: TraitMap,
pub maybe_unused_trait_imports: NodeSet,
pub maybe_unused_extern_crates: Vec<(NodeId, Span)>,
......
......@@ -582,7 +582,7 @@ fn pretty_print_type(
if let Some(hir_id) = self.tcx().hir().as_local_hir_id(did) {
p!(write("@{:?}", self.tcx().hir().span_by_hir_id(hir_id)));
let mut sep = " ";
for (freevar, upvar_ty) in self.tcx().freevars(did)
for (upvar, upvar_ty) in self.tcx().upvars(did)
.as_ref()
.map_or(&[][..], |v| &v[..])
.iter()
......@@ -591,7 +591,7 @@ fn pretty_print_type(
p!(
write("{}{}:",
sep,
self.tcx().hir().name_by_hir_id(freevar.var_id())),
self.tcx().hir().name_by_hir_id(upvar.var_id())),
print(upvar_ty));
sep = ", ";
}
......@@ -625,7 +625,7 @@ fn pretty_print_type(
p!(write("@{:?}", self.tcx().hir().span_by_hir_id(hir_id)));
}
let mut sep = " ";
for (freevar, upvar_ty) in self.tcx().freevars(did)
for (upvar, upvar_ty) in self.tcx().upvars(did)
.as_ref()
.map_or(&[][..], |v| &v[..])
.iter()
......@@ -634,7 +634,7 @@ fn pretty_print_type(
p!(
write("{}{}:",
sep,
self.tcx().hir().name_by_hir_id(freevar.var_id())),
self.tcx().hir().name_by_hir_id(upvar.var_id())),
print(upvar_ty));
sep = ", ";
}
......
......@@ -180,7 +180,7 @@ fn from_owned_resolver(
ExpansionResult {
defs: Steal::new(resolver.definitions),
resolutions: Steal::new(Resolutions {
freevars: resolver.freevars,
upvars: resolver.upvars,
export_map: resolver.export_map,
trait_map: resolver.trait_map,
glob_map: resolver.glob_map,
......@@ -199,7 +199,7 @@ pub fn from_resolver_ref(
ExpansionResult {
defs: Steal::new(resolver.definitions.clone()),
resolutions: Steal::new(Resolutions {
freevars: resolver.freevars.clone(),
upvars: resolver.upvars.clone(),
export_map: resolver.export_map.clone(),
trait_map: resolver.trait_map.clone(),
glob_map: resolver.glob_map.clone(),
......
......@@ -1814,12 +1814,12 @@ fn describe_field_from_ty(
ty::Array(ty, _) | ty::Slice(ty) =>
self.describe_field_from_ty(&ty, field, variant_index),
ty::Closure(def_id, _) | ty::Generator(def_id, _, _) => {
// `tcx.freevars(def_id)` returns an `Option`, which is `None` in case
// `tcx.upvars(def_id)` returns an `Option`, which is `None` in case
// the closure comes from another crate. But in that case we wouldn't
// be borrowck'ing it, so we can just unwrap:
let freevar = self.infcx.tcx.freevars(def_id).unwrap()[field.index()];
let upvar = self.infcx.tcx.upvars(def_id).unwrap()[field.index()];
self.infcx.tcx.hir().name_by_hir_id(freevar.var_id()).to_string()
self.infcx.tcx.hir().name_by_hir_id(upvar.var_id()).to_string()
}
_ => {
// Might need a revision when the fields in trait RFC is implemented
......@@ -2609,7 +2609,7 @@ fn closure_span(
if let hir::ExprKind::Closure(
.., args_span, _
) = expr {
for (v, place) in self.infcx.tcx.freevars(def_id)?.iter().zip(places) {
for (v, place) in self.infcx.tcx.upvars(def_id)?.iter().zip(places) {
match place {
Operand::Copy(place) |
Operand::Move(place) if target_place == place => {
......
......@@ -516,10 +516,10 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
span_bug!(expr.span, "closure expr w/o closure type: {:?}", closure_ty);
}
};
let upvars = cx.tcx.freevars(def_id).iter()
.flat_map(|freevars| freevars.iter())
let upvars = cx.tcx.upvars(def_id).iter()
.flat_map(|upvars| upvars.iter())
.zip(substs.upvar_tys(def_id, cx.tcx))
.map(|(freevar, ty)| capture_freevar(cx, expr, freevar, ty))
.map(|(upvar, ty)| capture_upvar(cx, expr, upvar, ty))
.collect();
ExprKind::Closure {
closure_id: def_id,
......@@ -1184,12 +1184,12 @@ fn overloaded_place<'a, 'gcx, 'tcx>(
ExprKind::Deref { arg: ref_expr.to_ref() }
}
fn capture_freevar<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
fn capture_upvar<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
closure_expr: &'tcx hir::Expr,
freevar: &hir::Freevar,
freevar_ty: Ty<'tcx>)
upvar: &hir::Upvar,
upvar_ty: Ty<'tcx>)
-> ExprRef<'tcx> {
let var_hir_id = freevar.var_id();
let var_hir_id = upvar.var_id();
let upvar_id = ty::UpvarId {
var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: cx.tcx.hir().local_def_id_from_hir_id(closure_expr.hir_id).to_local(),
......@@ -1201,7 +1201,7 @@ fn capture_freevar<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
temp_lifetime,
ty: var_ty,
span: closure_expr.span,
kind: convert_var(cx, closure_expr, freevar.res),
kind: convert_var(cx, closure_expr, upvar.res),
};
match upvar_capture {
ty::UpvarCapture::ByValue => captured_var.to_ref(),
......@@ -1213,7 +1213,7 @@ fn capture_freevar<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
};
Expr {
temp_lifetime,
ty: freevar_ty,
ty: upvar_ty,
span: closure_expr.span,
kind: ExprKind::Borrow {
borrow_kind,
......
......@@ -170,7 +170,7 @@ fn aggregate_field_path_elem(
if def_id.is_local() {
let tables = self.ecx.tcx.typeck_tables_of(def_id);
if let Some(upvars) = tables.upvar_list.get(&def_id) {
// Sometimes the index is beyond the number of freevars (seen
// Sometimes the index is beyond the number of upvars (seen
// for a generator).
if let Some(upvar_id) = upvars.get(field) {
let var_hir_id = upvar_id.var_path.hir_id;
......
......@@ -450,7 +450,7 @@ fn check_expr_kind<'a, 'tcx>(
// Paths in constant contexts cannot refer to local variables,
// as there are none, and thus closures can't have upvars there.
let closure_def_id = v.tcx.hir().local_def_id_from_hir_id(e.hir_id);
if !v.tcx.freevars(closure_def_id).map_or(true, |v| v.is_empty()) {
if !v.tcx.upvars(closure_def_id).map_or(true, |v| v.is_empty()) {
NotPromotable
} else {
nested_body_promotable
......
......@@ -29,7 +29,7 @@
};
use rustc::hir::def::Namespace::*;
use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
use rustc::hir::{Upvar, UpvarMap, TraitCandidate, TraitMap, GlobMap};
use rustc::ty::{self, DefIdTree};
use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
use rustc::{bug, span_bug};
......@@ -1668,8 +1668,8 @@ pub struct Resolver<'a> {
/// Resolutions for labels (node IDs of their corresponding blocks or loops).
label_res_map: NodeMap<NodeId>,
pub freevars: FreevarMap,
freevars_seen: NodeMap<NodeMap<usize>>,
pub upvars: UpvarMap,
upvars_seen: NodeMap<NodeMap<usize>>,
pub export_map: ExportMap<NodeId>,
pub trait_map: TraitMap,
......@@ -2033,8 +2033,8 @@ pub fn new(session: &'a Session,
partial_res_map: Default::default(),
import_res_map: Default::default(),
label_res_map: Default::default(),
freevars: Default::default(),
freevars_seen: Default::default(),
upvars: Default::default(),
upvars_seen: Default::default(),
export_map: FxHashMap::default(),
trait_map: Default::default(),
module_map,
......@@ -4054,21 +4054,21 @@ fn adjust_local_res(&mut self,
ClosureRibKind(function_id) => {
let prev_res = res;
let seen = self.freevars_seen
let seen = self.upvars_seen
.entry(function_id)
.or_default();
if let Some(&index) = seen.get(&node_id) {
res = Res::Upvar(node_id, index, function_id);
continue;
}
let vec = self.freevars
let vec = self.upvars
.entry(function_id)
.or_default();
let depth = vec.len();
res = Res::Upvar(node_id, depth, function_id);
if record_used {
vec.push(Freevar {
vec.push(Upvar {
res: prev_res,
span,
});
......
......@@ -722,7 +722,7 @@ fn coerce_closure_to_fn(&self,
let b = self.shallow_resolve(b);
match b.sty {
ty::FnPtr(fn_ty) if self.tcx.freevars(def_id_a).map_or(true, |v| v.is_empty()) => {
ty::FnPtr(fn_ty) if self.tcx.upvars(def_id_a).map_or(true, |v| v.is_empty()) => {
// We coerce the closure, which has fn type
// `extern "rust-call" fn((arg0,arg1,...)) -> _`
// to
......
......@@ -121,28 +121,28 @@ fn analyze_closure(
None
};
if let Some(freevars) = self.tcx.freevars(closure_def_id) {
let mut freevar_list: Vec<ty::UpvarId> = Vec::with_capacity(freevars.len());
for freevar in freevars.iter() {
if let Some(upvars) = self.tcx.upvars(closure_def_id) {
let mut upvar_list: Vec<ty::UpvarId> = Vec::with_capacity(upvars.len());
for upvar in upvars.iter() {
let upvar_id = ty::UpvarId {
var_path: ty::UpvarPath {
hir_id: freevar.var_id(),
hir_id: upvar.var_id(),
},
closure_expr_id: LocalDefId::from_def_id(closure_def_id),
};
debug!("seed upvar_id {:?}", upvar_id);
// Adding the upvar Id to the list of Upvars, which will be added
// to the map for the closure at the end of the for loop.
freevar_list.push(upvar_id);
upvar_list.push(upvar_id);
let capture_kind = match capture_clause {
hir::CaptureByValue => ty::UpvarCapture::ByValue,
hir::CaptureByRef => {
let origin = UpvarRegion(upvar_id, span);
let freevar_region = self.next_region_var(origin);
let upvar_region = self.next_region_var(origin);
let upvar_borrow = ty::UpvarBorrow {
kind: ty::ImmBorrow,
region: freevar_region,
region: upvar_region,
};
ty::UpvarCapture::ByRef(upvar_borrow)
}
......@@ -153,14 +153,14 @@ fn analyze_closure(
.upvar_capture_map
.insert(upvar_id, capture_kind);
}
// Add the vector of freevars to the map keyed with the closure id.
// Add the vector of upvars to the map keyed with the closure id.
// This gives us an easier access to them without having to call
// tcx.freevars again..
if !freevar_list.is_empty() {
// tcx.upvars again..
if !upvar_list.is_empty() {
self.tables
.borrow_mut()
.upvar_list
.insert(closure_def_id, freevar_list);
.insert(closure_def_id, upvar_list);
}
}
......@@ -246,12 +246,12 @@ fn final_upvar_tys(&self, closure_id: hir::HirId) -> Vec<Ty<'tcx>> {
let tcx = self.tcx;
let closure_def_id = tcx.hir().local_def_id_from_hir_id(closure_id);
tcx.freevars(closure_def_id).iter().flat_map(|freevars| {
freevars
tcx.upvars(closure_def_id).iter().flat_map(|upvars| {
upvars
.iter()
.map(|freevar| {
let var_hir_id = freevar.var_id();
let freevar_ty = self.node_ty(var_hir_id);
.map(|upvar| {
let var_hir_id = upvar.var_id();
let upvar_ty = self.node_ty(var_hir_id);
let upvar_id = ty::UpvarId {
var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: LocalDefId::from_def_id(closure_def_id),
......@@ -259,16 +259,16 @@ fn final_upvar_tys(&self, closure_id: hir::HirId) -> Vec<Ty<'tcx>> {
let capture = self.tables.borrow().upvar_capture(upvar_id);
debug!(
"var_id={:?} freevar_ty={:?} capture={:?}",
var_hir_id, freevar_ty, capture
"var_id={:?} upvar_ty={:?} capture={:?}",
var_hir_id, upvar_ty, capture
);
match capture {
ty::UpvarCapture::ByValue => freevar_ty,
ty::UpvarCapture::ByValue => upvar_ty,
ty::UpvarCapture::ByRef(borrow) => tcx.mk_ref(
borrow.region,
ty::TypeAndMut {
ty: freevar_ty,
ty: upvar_ty,
mutbl: borrow.kind.to_mutbl_lossy(),
},
),
......
......@@ -1093,8 +1093,8 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> &'tcx ty
}),
);
if let Some(freevars) = tcx.freevars(def_id) {
params.extend(freevars.iter().zip((dummy_args.len() as u32)..).map(|(_, i)| {
if let Some(upvars) = tcx.upvars(def_id) {
params.extend(upvars.iter().zip((dummy_args.len() as u32)..).map(|(_, i)| {
ty::GenericParamDef {
index: type_start + i,
name: Symbol::intern("<upvar>").as_interned_str(),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册