diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2016-02-16 18:36:41 +0200 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2016-03-09 16:45:28 +0200 |
| commit | ffa0860467aff2c1e5e2f6594cd7cf554da26c5e (patch) | |
| tree | d13a015c72e9d89513b1f4c34cf17d615b4f0f13 /src/librustc | |
| parent | b423a0f9ef488ca4cd9ff620a44566bb441eb21f (diff) | |
| download | rust-ffa0860467aff2c1e5e2f6594cd7cf554da26c5e.tar.gz rust-ffa0860467aff2c1e5e2f6594cd7cf554da26c5e.zip | |
Track fn type and lifetime parameters in TyFnDef.
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/middle/effect.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/intrinsicck.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/traits/select.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/ty/adjustment.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/ty/context.rs | 20 | ||||
| -rw-r--r-- | src/librustc/middle/ty/fast_reject.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/ty/flags.rs | 7 | ||||
| -rw-r--r-- | src/librustc/middle/ty/relate.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/ty/structural_impls.rs | 12 | ||||
| -rw-r--r-- | src/librustc/middle/ty/sty.rs | 8 | ||||
| -rw-r--r-- | src/librustc/middle/ty/util.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/ty/walk.rs | 6 | ||||
| -rw-r--r-- | src/librustc/util/ppaux.rs | 2 |
13 files changed, 37 insertions, 42 deletions
diff --git a/src/librustc/middle/effect.rs b/src/librustc/middle/effect.rs index 5f9fb791598..e6821cf639e 100644 --- a/src/librustc/middle/effect.rs +++ b/src/librustc/middle/effect.rs @@ -44,7 +44,7 @@ enum RootUnsafeContext { fn type_is_unsafe_function(ty: Ty) -> bool { match ty.sty { - ty::TyFnDef(_, ref f) | + ty::TyFnDef(_, _, ref f) | ty::TyFnPtr(ref f) => f.unsafety == hir::Unsafety::Unsafe, _ => false, } diff --git a/src/librustc/middle/intrinsicck.rs b/src/librustc/middle/intrinsicck.rs index 1293d8e833f..fd857513e5b 100644 --- a/src/librustc/middle/intrinsicck.rs +++ b/src/librustc/middle/intrinsicck.rs @@ -53,7 +53,7 @@ struct IntrinsicCheckingVisitor<'a, 'tcx: 'a> { impl<'a, 'tcx> IntrinsicCheckingVisitor<'a, 'tcx> { fn def_id_is_transmute(&self, def_id: DefId) -> bool { let intrinsic = match self.tcx.lookup_item_type(def_id).ty.sty { - ty::TyFnDef(_, ref bfty) => bfty.abi == RustIntrinsic, + ty::TyFnDef(_, _, ref bfty) => bfty.abi == RustIntrinsic, _ => return false }; intrinsic && self.tcx.item_name(def_id).as_str() == "transmute" @@ -238,7 +238,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for IntrinsicCheckingVisitor<'a, 'tcx> { Def::Fn(did) if self.def_id_is_transmute(did) => { let typ = self.tcx.node_id_to_type(expr.id); match typ.sty { - ty::TyFnDef(_, ref bare_fn_ty) if bare_fn_ty.abi == RustIntrinsic => { + ty::TyFnDef(_, _, ref bare_fn_ty) if bare_fn_ty.abi == RustIntrinsic => { if let ty::FnConverging(to) = bare_fn_ty.sig.0.output { let from = bare_fn_ty.sig.0.inputs[0]; self.check_transmute(expr.span, from, to, expr.id); diff --git a/src/librustc/middle/traits/select.rs b/src/librustc/middle/traits/select.rs index 6cd85a522b5..fbaf5a1306b 100644 --- a/src/librustc/middle/traits/select.rs +++ b/src/librustc/middle/traits/select.rs @@ -1286,7 +1286,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } // provide an impl, but only for suitable `fn` pointers - ty::TyFnDef(_, &ty::BareFnTy { + ty::TyFnDef(_, _, &ty::BareFnTy { unsafety: hir::Unsafety::Normal, abi: Abi::Rust, sig: ty::Binder(ty::FnSig { diff --git a/src/librustc/middle/ty/adjustment.rs b/src/librustc/middle/ty/adjustment.rs index ca614f84c0b..e4c293a74e8 100644 --- a/src/librustc/middle/ty/adjustment.rs +++ b/src/librustc/middle/ty/adjustment.rs @@ -155,7 +155,7 @@ impl<'tcx> ty::TyS<'tcx> { match *adjustment { AdjustReifyFnPointer => { match self.sty { - ty::TyFnDef(_, b) => { + ty::TyFnDef(_, _, b) => { cx.mk_ty(ty::TyFnPtr(b)) } _ => { diff --git a/src/librustc/middle/ty/context.rs b/src/librustc/middle/ty/context.rs index 8d74c5f3193..61a7f49f45d 100644 --- a/src/librustc/middle/ty/context.rs +++ b/src/librustc/middle/ty/context.rs @@ -41,7 +41,6 @@ use std::borrow::Borrow; use std::cell::{Cell, RefCell, Ref}; use std::hash::{Hash, Hasher}; use std::rc::Rc; -use syntax::abi::Abi; use syntax::ast::{self, Name, NodeId}; use syntax::attr; use syntax::parse::token::special_idents; @@ -946,30 +945,15 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn mk_fn_def(&self, def_id: DefId, + substs: &'tcx Substs<'tcx>, fty: BareFnTy<'tcx>) -> Ty<'tcx> { - self.mk_ty(TyFnDef(def_id, self.mk_bare_fn(fty))) + self.mk_ty(TyFnDef(def_id, substs, self.mk_bare_fn(fty))) } pub fn mk_fn_ptr(&self, fty: BareFnTy<'tcx>) -> Ty<'tcx> { self.mk_ty(TyFnPtr(self.mk_bare_fn(fty))) } - pub fn mk_ctor_fn(&self, - def_id: DefId, - input_tys: &[Ty<'tcx>], - output: Ty<'tcx>) -> Ty<'tcx> { - let input_args = input_tys.iter().cloned().collect(); - self.mk_fn_def(def_id, BareFnTy { - unsafety: hir::Unsafety::Normal, - abi: Abi::Rust, - sig: ty::Binder(ty::FnSig { - inputs: input_args, - output: ty::FnConverging(output), - variadic: false - }) - }) - } - pub fn mk_trait(&self, principal: ty::PolyTraitRef<'tcx>, bounds: ExistentialBounds<'tcx>) diff --git a/src/librustc/middle/ty/fast_reject.rs b/src/librustc/middle/ty/fast_reject.rs index 285fa5d8827..fc4db22a8a6 100644 --- a/src/librustc/middle/ty/fast_reject.rs +++ b/src/librustc/middle/ty/fast_reject.rs @@ -83,7 +83,7 @@ pub fn simplify_type(tcx: &TyCtxt, ty::TyTuple(ref tys) => { Some(TupleSimplifiedType(tys.len())) } - ty::TyFnDef(_, ref f) | ty::TyFnPtr(ref f) => { + ty::TyFnDef(_, _, ref f) | ty::TyFnPtr(ref f) => { Some(FunctionSimplifiedType(f.sig.0.inputs.len())) } ty::TyProjection(_) | ty::TyParam(_) => { diff --git a/src/librustc/middle/ty/flags.rs b/src/librustc/middle/ty/flags.rs index 04afb45bcf1..c491bd6ca5e 100644 --- a/src/librustc/middle/ty/flags.rs +++ b/src/librustc/middle/ty/flags.rs @@ -134,7 +134,12 @@ impl FlagComputation { self.add_tys(&ts[..]); } - &ty::TyFnDef(_, ref f) | &ty::TyFnPtr(ref f) => { + &ty::TyFnDef(_, substs, ref f) => { + self.add_substs(substs); + self.add_fn_sig(&f.sig); + } + + &ty::TyFnPtr(ref f) => { self.add_fn_sig(&f.sig); } } diff --git a/src/librustc/middle/ty/relate.rs b/src/librustc/middle/ty/relate.rs index 4c146e93174..c85d0a1a90d 100644 --- a/src/librustc/middle/ty/relate.rs +++ b/src/librustc/middle/ty/relate.rs @@ -568,11 +568,13 @@ pub fn super_relate_tys<'a,'tcx:'a,R>(relation: &mut R, } } - (&ty::TyFnDef(a_def_id, a_fty), &ty::TyFnDef(b_def_id, b_fty)) + (&ty::TyFnDef(a_def_id, a_substs, a_fty), + &ty::TyFnDef(b_def_id, b_substs, b_fty)) if a_def_id == b_def_id => { + let substs = try!(relate_substs(relation, None, a_substs, b_substs)); let fty = try!(relation.relate(a_fty, b_fty)); - Ok(tcx.mk_fn_def(a_def_id, fty)) + Ok(tcx.mk_fn_def(a_def_id, tcx.mk_substs(substs), fty)) } (&ty::TyFnPtr(a_fty), &ty::TyFnPtr(b_fty)) => diff --git a/src/librustc/middle/ty/structural_impls.rs b/src/librustc/middle/ty/structural_impls.rs index b504bba01b9..3fe9e02a90d 100644 --- a/src/librustc/middle/ty/structural_impls.rs +++ b/src/librustc/middle/ty/structural_impls.rs @@ -282,9 +282,12 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { } ty::TyTrait(ref trait_ty) => ty::TyTrait(trait_ty.fold_with(folder)), ty::TyTuple(ref ts) => ty::TyTuple(ts.fold_with(folder)), - ty::TyFnDef(def_id, ref f) => { + ty::TyFnDef(def_id, substs, ref f) => { + let substs = substs.fold_with(folder); let bfn = f.fold_with(folder); - ty::TyFnDef(def_id, folder.tcx().mk_bare_fn(bfn)) + ty::TyFnDef(def_id, + folder.tcx().mk_substs(substs), + folder.tcx().mk_bare_fn(bfn)) } ty::TyFnPtr(ref f) => { let bfn = f.fold_with(folder); @@ -322,7 +325,10 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { ty::TyEnum(_tid, ref substs) => substs.visit_with(visitor), ty::TyTrait(ref trait_ty) => trait_ty.visit_with(visitor), ty::TyTuple(ref ts) => ts.visit_with(visitor), - ty::TyFnDef(_, ref f) | ty::TyFnPtr(ref f) => f.visit_with(visitor), + ty::TyFnDef(_, substs, ref f) => { + substs.visit_with(visitor) || f.visit_with(visitor) + } + ty::TyFnPtr(ref f) => f.visit_with(visitor), ty::TyRef(r, ref tm) => r.visit_with(visitor) || tm.visit_with(visitor), ty::TyStruct(_did, ref substs) => substs.visit_with(visitor), ty::TyClosure(_did, ref substs) => substs.visit_with(visitor), diff --git a/src/librustc/middle/ty/sty.rs b/src/librustc/middle/ty/sty.rs index 217ae8fd494..2d7b7dc6e9b 100644 --- a/src/librustc/middle/ty/sty.rs +++ b/src/librustc/middle/ty/sty.rs @@ -129,9 +129,7 @@ pub enum TypeVariants<'tcx> { /// The anonymous type of a function declaration/definition. Each /// function has a unique type. - /// FIXME: Does this need to include substitutions? - /// `g::<i32>` and `g::<u32>` should have different types. - TyFnDef(DefId, &'tcx BareFnTy<'tcx>), + TyFnDef(DefId, &'tcx Substs<'tcx>, &'tcx BareFnTy<'tcx>), /// A pointer to a function. Written as `fn() -> i32`. /// FIXME: This is currently also used to represent the callee of a method; @@ -1142,7 +1140,7 @@ impl<'tcx> TyS<'tcx> { pub fn fn_sig(&self) -> &'tcx PolyFnSig<'tcx> { match self.sty { - TyFnDef(_, ref f) | TyFnPtr(ref f) => &f.sig, + TyFnDef(_, _, ref f) | TyFnPtr(ref f) => &f.sig, _ => panic!("Ty::fn_sig() called on non-fn type: {:?}", self) } } @@ -1150,7 +1148,7 @@ impl<'tcx> TyS<'tcx> { /// Returns the ABI of the given function. pub fn fn_abi(&self) -> abi::Abi { match self.sty { - TyFnDef(_, ref f) | TyFnPtr(ref f) => f.abi, + TyFnDef(_, _, ref f) | TyFnPtr(ref f) => f.abi, _ => panic!("Ty::fn_abi() called on non-fn type"), } } diff --git a/src/librustc/middle/ty/util.rs b/src/librustc/middle/ty/util.rs index 6947c7dd4dc..b9dd0a6af06 100644 --- a/src/librustc/middle/ty/util.rs +++ b/src/librustc/middle/ty/util.rs @@ -514,13 +514,9 @@ impl<'tcx> TyCtxt<'tcx> { region(state, *r); mt(state, m); } - TyFnDef(def_id, ref b) => { + TyFnDef(def_id, _, _) => { byte!(14); hash!(def_id); - hash!(b.unsafety); - hash!(b.abi); - fn_sig(state, &b.sig); - return false; } TyFnPtr(ref b) => { byte!(15); diff --git a/src/librustc/middle/ty/walk.rs b/src/librustc/middle/ty/walk.rs index 0d226e22db9..b6d93ecf78b 100644 --- a/src/librustc/middle/ty/walk.rs +++ b/src/librustc/middle/ty/walk.rs @@ -98,7 +98,11 @@ fn push_subtypes<'tcx>(stack: &mut Vec<Ty<'tcx>>, parent_ty: Ty<'tcx>) { ty::TyTuple(ref ts) => { push_reversed(stack, ts); } - ty::TyFnDef(_, ref ft) | ty::TyFnPtr(ref ft) => { + ty::TyFnDef(_, substs, ref ft) => { + push_reversed(stack, substs.types.as_slice()); + push_sig_subtypes(stack, &ft.sig); + } + ty::TyFnPtr(ref ft) => { push_sig_subtypes(stack, &ft.sig); } } diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 2bf8879f3a0..2b5674ed116 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -812,7 +812,7 @@ impl<'tcx> fmt::Display for ty::TypeVariants<'tcx> { } write!(f, ")") } - TyFnDef(def_id, ref bare_fn) => { + TyFnDef(def_id, substs, ref bare_fn) => { if bare_fn.unsafety == hir::Unsafety::Unsafe { try!(write!(f, "unsafe ")); } |
