]> git.lizzy.rs Git - rust.git/commitdiff
rollup merge of #19891: nikomatsakis/unique-fn-types-3
authorAlex Crichton <alex@alexcrichton.com>
Mon, 22 Dec 2014 20:51:23 +0000 (12:51 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Mon, 22 Dec 2014 20:51:23 +0000 (12:51 -0800)
Conflicts:
src/libcore/str.rs
src/librustc_trans/trans/closure.rs
src/librustc_typeck/collect.rs
src/libstd/path/posix.rs
src/libstd/path/windows.rs

39 files changed:
1  2 
src/libcollections/btree/map.rs
src/libcollections/btree/set.rs
src/libcollections/vec_map.rs
src/libcore/str.rs
src/librustc/metadata/decoder.rs
src/librustc/metadata/tydecode.rs
src/librustc/middle/astencode.rs
src/librustc/middle/expr_use_visitor.rs
src/librustc/middle/infer/combine.rs
src/librustc/middle/mem_categorization.rs
src/librustc/middle/traits/select.rs
src/librustc/middle/ty.rs
src/librustc/util/ppaux.rs
src/librustc_trans/trans/base.rs
src/librustc_trans/trans/callee.rs
src/librustc_trans/trans/closure.rs
src/librustc_trans/trans/consts.rs
src/librustc_trans/trans/debuginfo.rs
src/librustc_trans/trans/expr.rs
src/librustc_trans/trans/foreign.rs
src/librustc_trans/trans/glue.rs
src/librustc_trans/trans/intrinsic.rs
src/librustc_trans/trans/meth.rs
src/librustc_trans/trans/type_of.rs
src/librustc_typeck/astconv.rs
src/librustc_typeck/check/method/mod.rs
src/librustc_typeck/check/mod.rs
src/librustc_typeck/coherence/mod.rs
src/librustc_typeck/collect.rs
src/librustc_typeck/lib.rs
src/librustc_typeck/variance.rs
src/librustdoc/clean/mod.rs
src/librustdoc/html/markdown.rs
src/libstd/collections/hash/map.rs
src/libstd/collections/hash/set.rs
src/libstd/path/posix.rs
src/libstd/path/windows.rs
src/libsyntax/ext/base.rs
src/libunicode/u_str.rs

Simple merge
index 3b403d45d82e6f3bc77c496c05eabe81deb98783,4ab9c7a4fcdd902436abd3e7ded0861a53ac83d0..2935692ed1580d9537b1cb5d0f0a900e6b4bdf5a
@@@ -124,10 -124,11 +124,11 @@@ impl<T> BTreeSet<T> 
      /// assert_eq!(v, vec![1u,2,3,4]);
      /// ```
      #[unstable = "matches collection reform specification, waiting for dust to settle"]
 -    pub fn into_iter(self) -> MoveItems<T> {
 +    pub fn into_iter(self) -> IntoIter<T> {
          fn first<A, B>((a, _): (A, B)) -> A { a }
+         let first: fn((T, ())) -> T = first; // coerce to fn pointer
  
 -        MoveItems { iter: self.map.into_iter().map(first) }
 +        IntoIter { iter: self.map.into_iter().map(first) }
      }
  }
  
index 999025840caaabb8dce8884d69afe6d31f2e8e90,553eae4d896d16e7cc33e1ab7d60b78268a28a00..207e27ccdccc3619571257e1e2d6e712e0a3f517
@@@ -239,9 -241,10 +241,10 @@@ impl<V> VecMap<V> 
          fn filter<A>((i, v): (uint, Option<A>)) -> Option<(uint, A)> {
              v.map(|v| (i, v))
          }
+         let filter: fn((uint, Option<V>)) -> Option<(uint, V)> = filter; // coerce to fn ptr
  
          let values = replace(&mut self.v, vec!());
 -        MoveItems { iter: values.into_iter().enumerate().filter_map(filter) }
 +        IntoIter { iter: values.into_iter().enumerate().filter_map(filter) }
      }
  
      /// Return the number of elements in the map.
index f4a9e7e3f78220380af197ac7bac7842770e4b09,8381deb2bf7d729950d4116e4af64c14d5ff2c2f..de5b34ff0cadfc4f18150ad4d3fb6ca815cc5887
@@@ -1310,7 -2100,8 +1310,8 @@@ impl StrExt for str 
              else { line }
          }
  
 -        self.lines().map(f)
+         let f: fn(&str) -> &str = f; // coerce to fn pointer
 +        LinesAny { inner: self.lines().map(f) }
      }
  
      #[inline]
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 8632862f26a728db08e5a22c12241bfd15d0eeff,aaa80f840fdae1cc022a3ee4cbff32d7a6e910da..22fdea8afb59bbcace7efc92f52bb19c1e9f1d4f
@@@ -3997,9 -4012,23 +4015,23 @@@ pub fn adjust_ty<'tcx, F>(cx: &ctxt<'tc
                          }
                          ref b => {
                              cx.sess.bug(
-                                 format!("add_env adjustment on non-bare-fn: \
+                                 format!("add_env adjustment on non-fn-item: \
+                                          {}",
+                                         b).as_slice());
+                         }
+                     }
+                 }
+                 AdjustReifyFnPointer(_) => {
+                     match unadjusted_ty.sty {
+                         ty::ty_bare_fn(Some(_), ref b) => {
+                             ty::mk_bare_fn(cx, None, (*b).clone())
+                         }
+                         ref b => {
+                             cx.sess.bug(
+                                 format!("AdjustReifyFnPointer adjustment on non-fn-item: \
                                           {}",
 -                                        b).as_slice());
 +                                        b)[]);
                          }
                      }
                  }
Simple merge
index a18d403bd9540d3a4b9fba88c054ee146e2fa9b3,3be40aed57ac63bc9db0d5a5b018f012f62bd020..f49fc7f06c5014a2b5e656af9da9d5fdddcd1770
@@@ -955,10 -956,10 +956,10 @@@ pub fn trans_external_path<'a, 'tcx>(cc
                                       did: ast::DefId, t: Ty<'tcx>) -> ValueRef {
      let name = csearch::get_symbol(&ccx.sess().cstore, did);
      match t.sty {
-         ty::ty_bare_fn(ref fn_ty) => {
+         ty::ty_bare_fn(_, ref fn_ty) => {
              match ccx.sess().target.target.adjust_abi(fn_ty.abi) {
                  Rust | RustCall => {
 -                    get_extern_rust_fn(ccx, t, name.as_slice(), did)
 +                    get_extern_rust_fn(ccx, t, name[], did)
                  }
                  RustIntrinsic => {
                      ccx.sess().bug("unexpected intrinsic in trans_external_path")
Simple merge
index 8e56ef3c6f39664f95acf9d895ab6ac50cba48cc,bbf8cb1c07025f936aeb3bd0082212e06ce6c581..28716f0a48195c5b75fb141a31ed6c6e8cfdf8dd
@@@ -603,21 -602,10 +602,21 @@@ pub fn trans_unboxed_closure<'blk, 'tcx
  
  pub fn get_wrapper_for_bare_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
                                           closure_ty: Ty<'tcx>,
-                                          def: def::Def,
+                                          def_id: ast::DefId,
                                           fn_ptr: ValueRef,
 -                                         is_local: bool) -> ValueRef
 -{
 +                                         is_local: bool) -> ValueRef {
 +
 +    let def_id = match def {
 +        def::DefFn(did, _) | def::DefStaticMethod(did, _) |
 +        def::DefVariant(_, did, _) | def::DefStruct(did) => did,
 +        _ => {
 +            ccx.sess().bug(format!("get_wrapper_for_bare_fn: \
 +                                    expected a statically resolved fn, got \
 +                                    {}",
 +                                    def)[]);
 +        }
 +    };
 +
      match ccx.closure_bare_wrapper_cache().borrow().get(&fn_ptr) {
          Some(&llval) => return llval,
          None => {}
index 4f7d0f8fe754f141c1d950d512a193f9e2fec87e,eff735e4946bb881e235ad904774d750126b4114..bc386dc96a469230182c48529ba28b7307229158
@@@ -203,8 -202,12 +202,12 @@@ pub fn const_expr<'a, 'tcx>(cx: &CrateC
                      cx.sess()
                        .span_bug(e.span,
                                  format!("unexpected static function: {}",
 -                                        store).as_slice())
 +                                        store)[])
                  }
+                 ty::AdjustReifyFnPointer(_def_id) => {
+                     // FIXME(#19925) once fn item types are
+                     // zero-sized, we'll need to do something here
+                 }
                  ty::AdjustDerefRef(ref adj) => {
                      let mut ty = ety;
                      // Save the last autoderef in case we can avoid it.
Simple merge
Simple merge
index d7e3476a470fb544a1b3c0e55b78594ece43b719,e50d645afd8d546cc99cc15b8ed498705dd134a6..1bad476863fdb6fdec5c65ddd916f5f7cc049bd0
@@@ -228,12 -228,12 +228,12 @@@ pub fn trans_native_call<'blk, 'tcx>(bc
             ccx.tn().val_to_string(llretptr));
  
      let (fn_abi, fn_sig) = match callee_ty.sty {
-         ty::ty_bare_fn(ref fn_ty) => (fn_ty.abi, fn_ty.sig.clone()),
+         ty::ty_bare_fn(_, ref fn_ty) => (fn_ty.abi, fn_ty.sig.clone()),
          _ => ccx.sess().bug("trans_native_call called on non-function type")
      };
 -    let llsig = foreign_signature(ccx, &fn_sig, passed_arg_tys.as_slice());
 +    let llsig = foreign_signature(ccx, &fn_sig, passed_arg_tys[]);
      let fn_type = cabi::compute_abi_info(ccx,
 -                                         llsig.llarg_tys.as_slice(),
 +                                         llsig.llarg_tys[],
                                           llsig.llret_ty,
                                           llsig.ret_def);
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 692f120737a5b6d1ad52a63ef7d4808c6ea1677d,dc9fd289344705322b9a1408b0d0901dc48fc599..d749cd77cef2dc0b385ae47a0d1ea9ba5ab2c226
@@@ -936,10 -938,11 +938,11 @@@ impl<K: Eq + Hash<S>, V, S, H: Hasher<S
      /// let vec: Vec<(&str, int)> = map.into_iter().collect();
      /// ```
      #[unstable = "matches collection reform specification, waiting for dust to settle"]
 -    pub fn into_iter(self) -> MoveEntries<K, V> {
 +    pub fn into_iter(self) -> IntoIter<K, V> {
          fn last_two<A, B, C>((_, b, c): (A, B, C)) -> (B, C) { (b, c) }
+         let last_two: fn((SafeHash, K, V)) -> (K, V) = last_two;
  
 -        MoveEntries {
 +        IntoIter {
              inner: self.table.into_iter().map(last_two)
          }
      }
Simple merge
index a514837492af00e54bc87e18f0f93ba74fc05457,0808b2a4f4258a24bc97c29408a5227824e90f29..f0a00b421c3a34d55d5e35e8cd0e3d6f4240a459
@@@ -401,10 -402,8 +402,11 @@@ impl Path 
      /// Returns an iterator that yields each component of the path as Option<&str>.
      /// See components() for details.
      pub fn str_components<'a>(&'a self) -> StrComponents<'a> {
 -        let from_utf8: fn(&[u8]) -> Option<&str> = str::from_utf8; // coerce to fn ptr
 -        self.components().map(from_utf8)
 +        fn from_utf8(s: &[u8]) -> Option<&str> {
 +            str::from_utf8(s).ok()
 +        }
-         self.components().map(from_utf8)
++        let f: fn(&[u8]) -> Option<&str> = from_utf8; // coerce to fn ptr
++        self.components().map(f)
      }
  }
  
index 277c675c22d65fa812ce36d10742baf8b695077a,4b8fb7fad6a389f7ca289fcf58d1a4ee9fa9aff3..b24966241ff664d8e3dd5e74d197c95cee3cb9ad
@@@ -645,13 -649,14 +645,14 @@@ impl Path 
              Some(_) => {
                  let plen = self.prefix_len();
                  if repr.len() > plen && repr.as_bytes()[plen] == SEP_BYTE {
 -                    repr.slice_from(plen+1)
 -                } else { repr.slice_from(plen) }
 +                    repr[plen+1..]
 +                } else { repr[plen..] }
              }
 -            None if repr.as_bytes()[0] == SEP_BYTE => repr.slice_from(1),
 +            None if repr.as_bytes()[0] == SEP_BYTE => repr[1..],
              None => repr
          };
-         let ret = s.split_terminator(SEP).map(Some);
+         let some: fn(&'a str) -> Option<&'a str> = Some; // coerce to fn ptr
+         let ret = s.split_terminator(SEP).map(some);
          ret
      }
  
@@@ -1044,10 -1054,14 +1046,14 @@@ fn parse_prefix<'a>(mut path: &'a str) 
  
  // None result means the string didn't need normalizing
  fn normalize_helper<'a>(s: &'a str, prefix: Option<PathPrefix>) -> (bool, Option<Vec<&'a str>>) {
-     let f = if !prefix_is_verbatim(prefix) { is_sep } else { is_sep_verbatim };
+     let f: fn(char) -> bool = if !prefix_is_verbatim(prefix) {
+         is_sep
+     } else {
+         is_sep_verbatim
+     };
      let is_abs = s.len() > prefix_len(prefix) && f(s.char_at(prefix_len(prefix)));
 -    let s_ = s.slice_from(prefix_len(prefix));
 -    let s_ = if is_abs { s_.slice_from(1) } else { s_ };
 +    let s_ = s[prefix_len(prefix)..];
 +    let s_ = if is_abs { s_[1..] } else { s_ };
  
      if is_abs && s_.is_empty() {
          return (is_abs, match prefix {
Simple merge
index 7d59e3de7b1e6cda6f1b1f712d68f6a169d2971c,88d87717ff3e86d0c56529a16827828b28c1dd5f..65b8ad997f6a1426528696bdcfce826c74a2c885
@@@ -64,9 -143,12 +64,12 @@@ impl UnicodeStr for str 
      #[inline]
      fn words(&self) -> Words {
          fn is_not_empty(s: &&str) -> bool { !s.is_empty() }
+         let is_not_empty: fn(&&str) -> bool = is_not_empty; // coerce to fn pointer
          fn is_whitespace(c: char) -> bool { c.is_whitespace() }
+         let is_whitespace: fn(char) -> bool = is_whitespace; // coerce to fn pointer
  
 -        self.split(is_whitespace).filter(is_not_empty)
 +        Words { inner: self.split(is_whitespace).filter(is_not_empty) }
      }
  
      #[inline]