diff options
| author | Shotaro Yamada <sinkuu@sinkuu.xyz> | 2017-11-11 02:20:53 +0900 |
|---|---|---|
| committer | Shotaro Yamada <sinkuu@sinkuu.xyz> | 2017-11-14 17:43:43 +0900 |
| commit | ec2ff8f734bb2f3ff2c58fc8e5df089444da58fd (patch) | |
| tree | f3679953d8b1347327ce4fd9b7f001269fdfddec /src | |
| parent | c3ec1758571fdf75a4970f9f130b3b83d451ff62 (diff) | |
| download | rust-ec2ff8f734bb2f3ff2c58fc8e5df089444da58fd.tar.gz rust-ec2ff8f734bb2f3ff2c58fc8e5df089444da58fd.zip | |
Add TyCtxt::is_closure
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/ty/util.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/transform/check_unsafety.rs | 11 | ||||
| -rw-r--r-- | src/librustc_mir/transform/inline.rs | 3 |
3 files changed, 11 insertions, 9 deletions
diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index aa07a6b070e..a0219f2f95b 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -621,9 +621,13 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { result } + pub fn is_closure(self, def_id: DefId) -> bool { + self.def_key(def_id).disambiguated_data.data == DefPathData::ClosureExpr + } + pub fn closure_base_def_id(self, def_id: DefId) -> DefId { let mut def_id = def_id; - while self.def_key(def_id).disambiguated_data.data == DefPathData::ClosureExpr { + while self.is_closure(def_id) { def_id = self.parent_def_id(def_id).unwrap_or_else(|| { bug!("closure {:?} has no parent", def_id); }); diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs index cbf1b0b0899..302e65a0e34 100644 --- a/src/librustc_mir/transform/check_unsafety.rs +++ b/src/librustc_mir/transform/check_unsafety.rs @@ -15,7 +15,6 @@ use rustc::ty::maps::Providers; use rustc::ty::{self, TyCtxt}; use rustc::hir; use rustc::hir::def_id::DefId; -use rustc::hir::map::DefPathData; use rustc::lint::builtin::{SAFE_EXTERN_STATICS, UNUSED_UNSAFE}; use rustc::mir::*; use rustc::mir::visit::{LvalueContext, Visitor}; @@ -362,11 +361,11 @@ fn report_unused_unsafe(tcx: TyCtxt, used_unsafe: &FxHashSet<ast::NodeId>, id: a pub fn check_unsafety<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) { debug!("check_unsafety({:?})", def_id); - match tcx.def_key(def_id).disambiguated_data.data { - // closures are handled by their parent fn. - DefPathData::ClosureExpr => return, - _ => {} - }; + + // closures are handled by their parent fn. + if tcx.is_closure(def_id) { + return; + } let UnsafetyCheckResult { violations, diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 460af371e04..b9e87fb9ec6 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -20,7 +20,6 @@ use rustc::mir::transform::{MirPass, MirSource}; use rustc::mir::visit::*; use rustc::ty::{self, Instance, Ty, TyCtxt, TypeFoldable}; use rustc::ty::subst::{Subst,Substs}; -use rustc::hir::map::definitions::DefPathData; use std::collections::VecDeque; use super::simplify::{remove_dead_blocks, CfgSimplifier}; @@ -561,7 +560,7 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> { // A closure is passed its self-type and a tuple like `(arg1, arg2, ...)`, // hence mappings to tuple fields are needed. - if tcx.def_key(callsite.callee).disambiguated_data.data == DefPathData::ClosureExpr { + if tcx.is_closure(callsite.callee) { let mut args = args.into_iter(); let self_ = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_mir); let tuple = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_mir); |
