Commit Graph

35345 Commits

Author SHA1 Message Date
Jorge Aparicio
9126a24e42 libstd: convert Duration binops to by value 2014-12-13 20:15:39 -05:00
Jorge Aparicio
32168faf9f libstd: convert BitFlags binops to by value 2014-12-13 20:15:39 -05:00
Jorge Aparicio
baf79d4a11 libcollections: make EnumSet binops by value 2014-12-13 20:15:39 -05:00
Jorge Aparicio
076e932fd5 libcollections: String + &str 2014-12-13 20:15:39 -05:00
Jorge Aparicio
dbc7e17cce libcollections: Vec<T> + &[T] 2014-12-13 20:15:39 -05:00
Jorge Aparicio
65d3a40c07 libcore: fix move semantics fallout 2014-12-13 20:15:38 -05:00
Jorge Aparicio
c73259a269 libcore: convert binop traits to by value 2014-12-13 20:15:38 -05:00
Jorge Aparicio
227435a11e Tell regionck which binops are by value 2014-12-13 20:15:38 -05:00
Jorge Aparicio
5038f5a70c Tell expr_use_visitor which binops are by value 2014-12-13 20:15:38 -05:00
Jorge Aparicio
f64e52a7f7 Tell trans which binops are by value 2014-12-13 20:15:38 -05:00
Jorge Aparicio
c3a6d2860c Tell typeck which binops are by value 2014-12-13 20:15:38 -05:00
Jorge Aparicio
14c0a708cc syntax/ast_util: add is_by_value_binop() 2014-12-13 20:11:13 -05:00
bors
f07526a999 auto merge of #19669 : alfie/rust/master, r=sanxiyn 2014-12-14 01:07:31 +00:00
Jorge Aparicio
029789b98c Get rid of all the remaining uses of refN/valN/mutN/TupleN 2014-12-13 20:04:41 -05:00
Jorge Aparicio
17a9c2764f libcore: allow deprecated valN methods on doc tests 2014-12-13 20:04:41 -05:00
Jorge Aparicio
8720174bf2 libgraphviz: use tuple indexing 2014-12-13 20:04:41 -05:00
Jorge Aparicio
778be74cbb libcoretest: use tuple indexing 2014-12-13 20:04:41 -05:00
Jorge Aparicio
e792338318 librustdoc: use tuple indexing 2014-12-13 20:04:41 -05:00
Jorge Aparicio
0c5d22c9cd librustc_trans: use tuple indexing 2014-12-13 20:04:41 -05:00
Jorge Aparicio
821b836634 librustc: use tuple indexing 2014-12-13 20:04:41 -05:00
Jorge Aparicio
c434954b27 libsyntax: use tuple indexing 2014-12-13 20:04:40 -05:00
Jorge Aparicio
4fd6a99851 libregex: use tuple indexing 2014-12-13 20:04:40 -05:00
Jorge Aparicio
fe48a65aaa libstd: use tuple indexing 2014-12-13 20:04:40 -05:00
Jorge Aparicio
4deb27e67a libcollections: use tuple indexing 2014-12-13 20:04:40 -05:00
Jorge Aparicio
2e8963debc libunicode: use tuple indexing 2014-12-13 20:04:40 -05:00
Jorge Aparicio
0c9b6ae6a8 Deprecate the TupleN traits 2014-12-13 20:04:40 -05:00
bors
444fa1b7cf auto merge of #19467 : japaric/rust/uc, r=alexcrichton
This PR moves almost all our current uses of closures, both in public API and internal uses, to the new "unboxed" closures system.

In most cases, downstream code that *only uses* closures will continue to work as it is. The reason is that the `|| {}` syntax can be inferred either as a boxed or an "unboxed" closure according to the context. For example the following code will continue to work:

``` rust
some_option.map(|x| x.transform_with(upvar))
```

And will get silently upgraded to an "unboxed" closure.

In some other cases, it may be necessary to "annotate" which `Fn*` trait the closure implements:

```
// Change this
|x| { /* body */}
// to either of these
|: x| { /* body */}  // closure implements the FnOnce trait
|&mut : x| { /* body */}  // FnMut
|&: x| { /* body */}  // Fn
```

This mainly occurs when the closure is assigned to a variable first, and then passed to a function/method.

``` rust
let closure = |: x| x.transform_with(upvar);
some.option.map(closure)
```

(It's very likely that in the future, an improved inference engine will make this annotation unnecessary)

Other cases that require annotation are closures that implement some trait via a blanket `impl`, for example:

- `std::finally::Finally`
- `regex::Replacer`
- `std::str::CharEq`

``` rust
string.trim_left_chars(|c: char| c.is_whitespace())
//~^ ERROR: the trait `Fn<(char,), bool>` is not implemented for the type `|char| -> bool`
string.trim_left_chars(|&: c: char| c.is_whitespace())  // OK
```

Finally, all implementations of traits that contain boxed closures in the arguments of their methods are now broken. And will need to be updated to use unboxed closures. These are the main affected traits:

- `serialize::Decoder`
- `serialize::DecoderHelpers`
- `serialize::Encoder`
- `serialize::EncoderHelpers`
- `rustrt::ToCStr`

For example, change this:

``` rust
// libserialize/json.rs
impl<'a> Encoder<io::IoError> for Encoder<'a> {
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
}
```

to:

``` rust
// libserialize/json.rs
impl<'a> Encoder<io::IoError> for Encoder<'a> {
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult
    {
        f(self)
    }
}
```

[breaking-change]

---

### How the `Fn*` bound has been selected

I've chosen the bounds to make the functions/structs as "generic as possible", i.e. to let them allow the maximum amount of input.

- An `F: FnOnce` bound accepts the three kinds of closures: `|:|`, `|&mut:|` and `|&:|`.
- An `F: FnMut` bound only accepts "non-consuming" closures: `|&mut:|` and `|&:|`.
- An `F: Fn` bound only accept the "immutable environment" closures: `|&:|`.

This means that whenever possible the `FnOnce` bound has been used, if the `FnOnce` bound couldn't be used, then the `FnMut` was used. The `Fn` bound was never used in the whole repository.

The `FnMut` bound was the most used, because it resembles the semantics of the current boxed closures: the closure can modify its environment, and the closure may be called several times.

The `FnOnce` bound allows new semantics: you can move out the upvars when the closure is called. This can be effectively paired with the `move || {}` syntax to transfer ownership from the environment to the closure caller.

In the case of trait methods, is hard to select the "right" bound since we can't control how the trait may be implemented by downstream users. In these cases, I have selected the bound based on how we use these traits in the repository. For this reason the selected bounds may not be ideal, and may require tweaking before stabilization.

r? @aturon
2014-12-13 22:57:21 +00:00
Jorge Aparicio
b8e0b81dd5 librustc_borrowck: add #![feature(unboxed_closures)] 2014-12-13 17:40:34 -05:00
Alex Crichton
8abe7846d6 Deprecate more in-tree libs for crates.io
This commit deprecates a few more in-tree libs for their crates.io counterparts.
Note that this commit does not make use of the #[deprecated] tag to prevent
warnings from being generated for in-tree usage. Once #[unstable] warnings are
turned on then all external users will be warned to move.

These crates have all been duplicated in rust-lang/$crate repositories so
development can happen independently of the in-tree copies. We can explore at a
later date replacing the in-tree copies with the external copies, but at this
time the libraries have changed very little over the past few months so it's
unlikely for changes to be sent to both repos.

cc #19260
2014-12-13 14:18:44 -08:00
Vadim Chugunov
317d91261b Windows dbghelp strips leading underscores from symbols, so let's accept "ZN...E" form too.
Also, print PC displacement from symbols.
2014-12-13 14:16:53 -08:00
Jorge Aparicio
db8300ce06 libstd: add missing imports 2014-12-13 17:03:48 -05:00
Jorge Aparicio
6f28816f87 Remove some unnecessary move keywords 2014-12-13 17:03:48 -05:00
Jorge Aparicio
745225d905 libtest: use unboxed closures 2014-12-13 17:03:48 -05:00
Jorge Aparicio
015c0fcee5 librustc_driver: use unboxed closures 2014-12-13 17:03:48 -05:00
Jorge Aparicio
521a6e62b1 librustc_typeck: use unboxed closures 2014-12-13 17:03:48 -05:00
Jorge Aparicio
888f24969f librustdoc: use unboxed closures 2014-12-13 17:03:48 -05:00
Jorge Aparicio
0676c3bf03 librustc_trans: use unboxed closures 2014-12-13 17:03:48 -05:00
Jorge Aparicio
0d4d8b9b78 librustc_trans: fix fallout 2014-12-13 17:03:47 -05:00
Jorge Aparicio
46272c18a2 librustc_typeck: fix fallout 2014-12-13 17:03:47 -05:00
Jorge Aparicio
1195708f64 librustc: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
933e7b4a3e librustc_llvm: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
3739a2427b librustc_trans: fix fallout 2014-12-13 17:03:47 -05:00
Jorge Aparicio
451eef5c40 librustc_back: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
d3d707c883 librustc: fix fallout 2014-12-13 17:03:47 -05:00
Jorge Aparicio
0dac05dd62 libsyntax: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
2160427900 Fix benches 2014-12-13 17:03:47 -05:00
Jorge Aparicio
cdbb3ca9b7 libstd: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
be53d619f8 librustrt: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
b44b5da8c2 libregex_macros: use unboxed closures 2014-12-13 17:03:47 -05:00
Jorge Aparicio
879ebce6a4 libcollections: use unboxed closures 2014-12-13 17:03:47 -05:00