]> git.lizzy.rs Git - rust.git/commitdiff
Review changes
authorest31 <MTest31@outlook.com>
Thu, 23 Feb 2017 23:32:21 +0000 (00:32 +0100)
committerest31 <MTest31@outlook.com>
Thu, 23 Feb 2017 23:32:21 +0000 (00:32 +0100)
* use more convenient mk_substs function
* remove type annotations
* use map_bound one level farther outside
* style improvements

src/librustc_trans/mir/constant.rs
src/librustc_trans/mir/rvalue.rs
src/librustc_typeck/check/coercion.rs
src/test/compile-fail/closure-no-fn.rs
src/test/compile-fail/feature-gate-closure_to_fn_coercion.rs
src/test/run-pass/closure-to-fn-coercion.rs

index e7582061b54197553192527c58dced3572462c29..e6cae2f9f3296dba5297a733f11012105762a627 100644 (file)
@@ -20,7 +20,7 @@
 use rustc::mir::tcx::LvalueTy;
 use rustc::ty::{self, layout, Ty, TyCtxt, TypeFoldable};
 use rustc::ty::cast::{CastTy, IntTy};
-use rustc::ty::subst::Substs;
+use rustc::ty::subst::{Kind, Substs};
 use rustc_data_structures::indexed_vec::{Idx, IndexVec};
 use {abi, adt, base, Disr, machine};
 use callee::Callee;
@@ -589,16 +589,8 @@ fn const_rvalue(&self, rvalue: &mir::Rvalue<'tcx>,
                                     .unwrap().def_id;
                                 // Now create its substs [Closure, Tuple]
                                 let input = tcx.closure_type(def_id, substs).sig.input(0);
-                                let substs = Substs::for_item(tcx,
-                                    call_once,
-                                    |_, _| {bug!()},
-                                    |def, _| { match def.index {
-                                                0 => operand.ty.clone(),
-                                                1 => input.skip_binder(),
-                                                _ => bug!(),
-                                            } }
-                                );
-
+                                let substs = tcx.mk_substs([operand.ty, input.skip_binder()]
+                                    .iter().cloned().map(Kind::from));
                                 Callee::def(self.ccx, call_once, substs)
                                     .reify(self.ccx)
                             }
index 95bb1dd7e0f347c5ab1a29fcac4eba49cc1618f6..6f6d81a25350fe229c20c891c3c4ad4f6b319d49 100644 (file)
@@ -12,7 +12,7 @@
 use rustc::ty::{self, Ty};
 use rustc::ty::cast::{CastTy, IntTy};
 use rustc::ty::layout::Layout;
-use rustc::ty::subst::Substs;
+use rustc::ty::subst::Kind;
 use rustc::mir::tcx::LvalueTy;
 use rustc::mir;
 use middle::lang_items::ExchangeMallocFnLangItem;
@@ -202,16 +202,8 @@ pub fn trans_rvalue_operand(&mut self,
                                     .unwrap().def_id;
                                 // Now create its substs [Closure, Tuple]
                                 let input = bcx.tcx().closure_type(def_id, substs).sig.input(0);
-                                let substs = Substs::for_item(bcx.tcx(),
-                                    call_once,
-                                    |_, _| {bug!()},
-                                    |def, _| { match def.index {
-                                                0 => operand.ty.clone(),
-                                                1 => input.skip_binder(),
-                                                _ => bug!(),
-                                          } }
-                                );
-
+                                let substs = bcx.tcx().mk_substs([operand.ty, input.skip_binder()]
+                                    .iter().cloned().map(Kind::from));
                                 OperandValue::Immediate(
                                     Callee::def(bcx.ccx, call_once, substs)
                                         .reify(bcx.ccx))
index ab498b453dde10cd40df179d534d55d2051404a8..424e3143929f4d8d2265f05d22a0908c5dc53dc3 100644 (file)
 use rustc::infer::{Coercion, InferOk, TypeTrace};
 use rustc::traits::{self, ObligationCause, ObligationCauseCode};
 use rustc::ty::adjustment::{Adjustment, Adjust, AutoBorrow};
-use rustc::ty::{self, LvaluePreference, TypeVariants, TypeAndMut,
+use rustc::ty::{self, LvaluePreference, TypeAndMut,
                 Ty, ClosureSubsts};
 use rustc::ty::fold::TypeFoldable;
 use rustc::ty::error::TypeError;
 use rustc::ty::relate::RelateResult;
-use syntax::ast::NodeId;
 use syntax::abi;
 use syntax::feature_gate;
 use util::common::indent;
@@ -573,7 +572,7 @@ fn coerce_closure_to_fn(&self,
 
         let b = self.shallow_resolve(b);
 
-        let node_id_a :NodeId = self.tcx.hir.as_local_node_id(def_id_a).unwrap();
+        let node_id_a = self.tcx.hir.as_local_node_id(def_id_a).unwrap();
         match b.sty {
             ty::TyFnPtr(_) if self.tcx.with_freevars(node_id_a, |v| v.is_empty()) => {
                 if !self.tcx.sess.features.borrow().closure_to_fn_coercion {
@@ -589,16 +588,16 @@ fn coerce_closure_to_fn(&self,
                 // to
                 //     `fn(arg0,arg1,...) -> _`
                 let sig = self.closure_type(def_id_a, substs_a).sig;
-                let converted_sig = sig.input(0).map_bound(|v| {
-                    let params_iter = match v.sty {
-                        TypeVariants::TyTuple(params, _) => {
+                let converted_sig = sig.map_bound(|s| {
+                    let params_iter = match s.inputs()[0].sty {
+                        ty::TyTuple(params, _) => {
                             params.into_iter().cloned()
                         }
                         _ => bug!(),
                     };
                     self.tcx.mk_fn_sig(params_iter,
-                                       sig.output().skip_binder(),
-                                       sig.variadic())
+                                       s.output(),
+                                       s.variadic)
                 });
                 let fn_ty = self.tcx.mk_bare_fn(ty::BareFnTy {
                     unsafety: hir::Unsafety::Normal,
index 6ad65523833a941530e7ba3388a207a4dc84aeec..fe179e8a48f16e897879b57554d450e4740025bd 100644 (file)
 
 fn main() {
     let mut a = 0u8;
-    let foo :fn(u8) -> u8 = |v: u8| { a += v; a };
+    let foofn(u8) -> u8 = |v: u8| { a += v; a };
     //~^ ERROR mismatched types
     let b = 0u8;
-    let bar :fn() -> u8 = || { b };
+    let barfn() -> u8 = || { b };
     //~^ ERROR mismatched types
-    let baz :fn() -> u8 = || { b } as fn() -> u8;
+    let bazfn() -> u8 = || { b } as fn() -> u8;
     //~^ ERROR mismatched types
     //~^^ ERROR non-scalar cast
 }
index 20ed24f025b8965e465b05f3e8e2046a221e6eb6..d074a35628ea876994255253b5639923308f3175 100644 (file)
@@ -13,7 +13,7 @@
 
 #[cfg(a)]
 mod a {
-    const FOO :fn(u8) -> u8 = |v: u8| { v };
+    const FOOfn(u8) -> u8 = |v: u8| { v };
     //[a]~^ ERROR non-capturing closure to fn coercion is experimental
     //[a]~^^ ERROR mismatched types
 
@@ -34,7 +34,7 @@ fn func_specific() -> (fn() -> u32) {
     fn foo() {
         // Items
         assert_eq!(func_specific()(), 42);
-        let foo :fn(u8) -> u8 = |v: u8| { v };
+        let foofn(u8) -> u8 = |v: u8| { v };
         //[b]~^ ERROR non-capturing closure to fn coercion is experimental
         //[b]~^^ ERROR mismatched types
     }
index f3f0736041b545fe4530b5128af1403ff20aa166..13d1d6aa13900cf63193f7ba824c9dfa484c99f2 100644 (file)
@@ -12,7 +12,7 @@
 
 #![feature(closure_to_fn_coercion)]
 
-const FOO :fn(u8) -> u8 = |v: u8| { v };
+const FOOfn(u8) -> u8 = |v: u8| { v };
 
 const BAR: [fn(&mut u32); 5] = [
     |_: &mut u32| {},
@@ -28,14 +28,14 @@ fn func_specific() -> (fn() -> u32) {
 fn main() {
     // Items
     assert_eq!(func_specific()(), 42);
-    let foo :fn(u8) -> u8 = |v: u8| { v };
+    let foofn(u8) -> u8 = |v: u8| { v };
     assert_eq!(foo(31), 31);
     // Constants
     assert_eq!(FOO(31), 31);
-    let mut a :u32 = 0;
-    assert_eq!({BAR[0](&mut a); a }, 0);
-    assert_eq!({BAR[1](&mut a); a }, 1);
-    assert_eq!({BAR[2](&mut a); a }, 3);
-    assert_eq!({BAR[3](&mut a); a }, 6);
-    assert_eq!({BAR[4](&mut a); a }, 10);
+    let mut au32 = 0;
+    assert_eq!({ BAR[0](&mut a); a }, 0);
+    assert_eq!({ BAR[1](&mut a); a }, 1);
+    assert_eq!({ BAR[2](&mut a); a }, 3);
+    assert_eq!({ BAR[3](&mut a); a }, 6);
+    assert_eq!({ BAR[4](&mut a); a }, 10);
 }