Skip to content

Commit 190ff3d

Browse files
committed
---
yaml --- r: 232737 b: refs/heads/try c: af83d98 h: refs/heads/master i: 232735: 8eec260 v: v3
1 parent aad2025 commit 190ff3d

File tree

36 files changed

+702
-316
lines changed

36 files changed

+702
-316
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: edeb4f1c86cbf6af8ef9874d4b3af50f721ea1b8
33
refs/heads/snap-stage3: 1af31d4974e33027a68126fa5a5a3c2c6491824f
4-
refs/heads/try: 277eeb95c33ce33090409549b184c9977bf535e5
4+
refs/heads/try: af83d98d2444ff4af97a0f150fa5e5657de5b282
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
66
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
77
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try/src/doc/reference.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,7 @@ fn draw_twice<T: Shape>(surface: Surface, sh: T) {
14521452
}
14531453
```
14541454

1455-
Traits also define an [trait object](#trait-objects) with the same
1455+
Traits also define a [trait object](#trait-objects) with the same
14561456
name as the trait. Values of this type are created by coercing from a
14571457
pointer of some specific type to a pointer of trait type. For example,
14581458
`&T` could be coerced to `&Shape` if `T: Shape` holds (and similarly
@@ -1881,11 +1881,15 @@ type int8_t = i8;
18811881
- `no_start` - disable linking to the `native` crate, which specifies the
18821882
"start" language item.
18831883
- `no_std` - disable linking to the `std` crate.
1884-
- `plugin` load a list of named crates as compiler plugins, e.g.
1884+
- `plugin` - load a list of named crates as compiler plugins, e.g.
18851885
`#![plugin(foo, bar)]`. Optional arguments for each plugin,
18861886
i.e. `#![plugin(foo(... args ...))]`, are provided to the plugin's
18871887
registrar function. The `plugin` feature gate is required to use
18881888
this attribute.
1889+
- `recursion_limit` - Sets the maximum depth for potentially
1890+
infinitely-recursive compile-time operations like
1891+
auto-dereference or macro expansion. The default is
1892+
`#![recursion_limit="64"]`.
18891893

18901894
### Module-only attributes
18911895

branches/try/src/doc/trpl/crates-and-modules.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ $ ls target/debug
115115
build deps examples libphrases-a7448e02a0468eaa.rlib native
116116
```
117117

118-
`libphrase-hash.rlib` is the compiled crate. Before we see how to use this
118+
`libphrases-hash.rlib` is the compiled crate. Before we see how to use this
119119
crate from another crate, let’s break it up into multiple files.
120120

121121
# Multiple file crates

branches/try/src/doc/trpl/error-handling.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@ Because these kinds of situations are relatively rare, use panics sparingly.
208208

209209
In certain circumstances, even though a function may fail, we may want to treat
210210
it as a panic instead. For example, `io::stdin().read_line(&mut buffer)` returns
211-
a `Result<usize>`, when there is an error reading the line. This allows us to
212-
handle and possibly recover from error.
211+
a `Result<usize>`, which can indicate an error if one occurs when reading the line.
212+
This allows us to handle and possibly recover from errors.
213213

214214
If we don't want to handle this error, and would rather just abort the program,
215215
we can use the `unwrap()` method:

branches/try/src/doc/trpl/testing.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,66 @@ fn it_works() {
219219
This is a very common use of `assert_eq!`: call some function with
220220
some known arguments and compare it to the expected output.
221221

222+
# The `ignore` attribute
223+
224+
Sometimes a few specific tests can be very time-consuming to execute. These
225+
can be disabled by default by using the `ignore` attribute:
226+
227+
```rust
228+
#[test]
229+
fn it_works() {
230+
assert_eq!(4, add_two(2));
231+
}
232+
233+
#[test]
234+
#[ignore]
235+
fn expensive_test() {
236+
// code that takes an hour to run
237+
}
238+
```
239+
240+
Now we run our tests and see that `it_works` is run, but `expensive_test` is
241+
not:
242+
243+
```bash
244+
$ cargo test
245+
Compiling adder v0.0.1 (file:///home/you/projects/adder)
246+
Running target/adder-91b3e234d4ed382a
247+
248+
running 2 tests
249+
test expensive_test ... ignored
250+
test it_works ... ok
251+
252+
test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured
253+
254+
Doc-tests adder
255+
256+
running 0 tests
257+
258+
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
259+
```
260+
261+
The expensive tests can be run explicitly using `cargo test -- --ignored`:
262+
263+
```bash
264+
$ cargo test -- --ignored
265+
Running target/adder-91b3e234d4ed382a
266+
267+
running 1 test
268+
test expensive_test ... ok
269+
270+
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
271+
272+
Doc-tests adder
273+
274+
running 0 tests
275+
276+
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
277+
```
278+
279+
The `--ignored` argument is an argument to the test binary, and not to cargo,
280+
which is why the command is `cargo test -- --ignored`.
281+
222282
# The `tests` module
223283

224284
There is one way in which our existing example is not idiomatic: it's

branches/try/src/liballoc/arc.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ use boxed::Box;
7373

7474
use core::sync::atomic;
7575
use core::sync::atomic::Ordering::{Relaxed, Release, Acquire, SeqCst};
76+
use core::borrow;
7677
use core::fmt;
7778
use core::cmp::Ordering;
7879
use core::mem::{align_of_val, size_of_val};
@@ -1109,3 +1110,7 @@ mod tests {
11091110
assert!(y.upgrade().is_none());
11101111
}
11111112
}
1113+
1114+
impl<T: ?Sized> borrow::Borrow<T> for Arc<T> {
1115+
fn borrow(&self) -> &T { &**self }
1116+
}

branches/try/src/liballoc/boxed.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ use heap;
5757
use raw_vec::RawVec;
5858

5959
use core::any::Any;
60+
use core::borrow;
6061
use core::cmp::Ordering;
6162
use core::fmt;
6263
use core::hash::{self, Hash};
@@ -562,3 +563,10 @@ impl<T: Clone> Clone for Box<[T]> {
562563
}
563564
}
564565

566+
impl<T: ?Sized> borrow::Borrow<T> for Box<T> {
567+
fn borrow(&self) -> &T { &**self }
568+
}
569+
570+
impl<T: ?Sized> borrow::BorrowMut<T> for Box<T> {
571+
fn borrow_mut(&mut self) -> &mut T { &mut **self }
572+
}

branches/try/src/liballoc/rc.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ use boxed::Box;
158158
#[cfg(test)]
159159
use std::boxed::Box;
160160

161+
use core::borrow;
161162
use core::cell::Cell;
162163
use core::cmp::Ordering;
163164
use core::fmt;
@@ -1091,3 +1092,7 @@ mod tests {
10911092
assert_eq!(foo, foo.clone());
10921093
}
10931094
}
1095+
1096+
impl<T: ?Sized> borrow::Borrow<T> for Rc<T> {
1097+
fn borrow(&self) -> &T { &**self }
1098+
}

branches/try/src/libcollections/borrow.rs

Lines changed: 1 addition & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -21,119 +21,10 @@ use core::ops::Deref;
2121
use core::option::Option;
2222

2323
use fmt;
24-
use alloc::{boxed, rc, arc};
2524

2625
use self::Cow::*;
2726

28-
/// A trait for borrowing data.
29-
///
30-
/// In general, there may be several ways to "borrow" a piece of data. The
31-
/// typical ways of borrowing a type `T` are `&T` (a shared borrow) and `&mut T`
32-
/// (a mutable borrow). But types like `Vec<T>` provide additional kinds of
33-
/// borrows: the borrowed slices `&[T]` and `&mut [T]`.
34-
///
35-
/// When writing generic code, it is often desirable to abstract over all ways
36-
/// of borrowing data from a given type. That is the role of the `Borrow`
37-
/// trait: if `T: Borrow<U>`, then `&U` can be borrowed from `&T`. A given
38-
/// type can be borrowed as multiple different types. In particular, `Vec<T>:
39-
/// Borrow<Vec<T>>` and `Vec<T>: Borrow<[T]>`.
40-
///
41-
/// If you are implementing `Borrow` and both `Self` and `Borrowed` implement
42-
/// `Hash`, `Eq`, and/or `Ord`, they must produce the same result.
43-
///
44-
/// `Borrow` is very similar to, but different than, `AsRef`. See
45-
/// [the book][book] for more.
46-
///
47-
/// [book]: ../../book/borrow-and-asref.html
48-
#[stable(feature = "rust1", since = "1.0.0")]
49-
pub trait Borrow<Borrowed: ?Sized> {
50-
/// Immutably borrows from an owned value.
51-
///
52-
/// # Examples
53-
///
54-
/// ```
55-
/// use std::borrow::Borrow;
56-
///
57-
/// fn check<T: Borrow<str>>(s: T) {
58-
/// assert_eq!("Hello", s.borrow());
59-
/// }
60-
///
61-
/// let s = "Hello".to_string();
62-
///
63-
/// check(s);
64-
///
65-
/// let s = "Hello";
66-
///
67-
/// check(s);
68-
/// ```
69-
#[stable(feature = "rust1", since = "1.0.0")]
70-
fn borrow(&self) -> &Borrowed;
71-
}
72-
73-
/// A trait for mutably borrowing data.
74-
///
75-
/// Similar to `Borrow`, but for mutable borrows.
76-
#[stable(feature = "rust1", since = "1.0.0")]
77-
pub trait BorrowMut<Borrowed: ?Sized> : Borrow<Borrowed> {
78-
/// Mutably borrows from an owned value.
79-
///
80-
/// # Examples
81-
///
82-
/// ```
83-
/// use std::borrow::BorrowMut;
84-
///
85-
/// fn check<T: BorrowMut<[i32]>>(mut v: T) {
86-
/// assert_eq!(&mut [1, 2, 3], v.borrow_mut());
87-
/// }
88-
///
89-
/// let v = vec![1, 2, 3];
90-
///
91-
/// check(v);
92-
/// ```
93-
#[stable(feature = "rust1", since = "1.0.0")]
94-
fn borrow_mut(&mut self) -> &mut Borrowed;
95-
}
96-
97-
#[stable(feature = "rust1", since = "1.0.0")]
98-
impl<T: ?Sized> Borrow<T> for T {
99-
fn borrow(&self) -> &T { self }
100-
}
101-
102-
#[stable(feature = "rust1", since = "1.0.0")]
103-
impl<T: ?Sized> BorrowMut<T> for T {
104-
fn borrow_mut(&mut self) -> &mut T { self }
105-
}
106-
107-
#[stable(feature = "rust1", since = "1.0.0")]
108-
impl<'a, T: ?Sized> Borrow<T> for &'a T {
109-
fn borrow(&self) -> &T { &**self }
110-
}
111-
112-
#[stable(feature = "rust1", since = "1.0.0")]
113-
impl<'a, T: ?Sized> Borrow<T> for &'a mut T {
114-
fn borrow(&self) -> &T { &**self }
115-
}
116-
117-
#[stable(feature = "rust1", since = "1.0.0")]
118-
impl<'a, T: ?Sized> BorrowMut<T> for &'a mut T {
119-
fn borrow_mut(&mut self) -> &mut T { &mut **self }
120-
}
121-
122-
impl<T: ?Sized> Borrow<T> for boxed::Box<T> {
123-
fn borrow(&self) -> &T { &**self }
124-
}
125-
126-
impl<T: ?Sized> BorrowMut<T> for boxed::Box<T> {
127-
fn borrow_mut(&mut self) -> &mut T { &mut **self }
128-
}
129-
130-
impl<T: ?Sized> Borrow<T> for rc::Rc<T> {
131-
fn borrow(&self) -> &T { &**self }
132-
}
133-
134-
impl<T: ?Sized> Borrow<T> for arc::Arc<T> {
135-
fn borrow(&self) -> &T { &**self }
136-
}
27+
pub use core::borrow::{Borrow, BorrowMut};
13728

13829
#[stable(feature = "rust1", since = "1.0.0")]
13930
impl<'a, B: ?Sized> Borrow<B> for Cow<'a, B> where B: ToOwned, <B as ToOwned>::Owned: 'a {

branches/try/src/libcollections/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#![feature(unicode)]
5757
#![feature(unique)]
5858
#![feature(unsafe_no_drop_flag, filling_drop)]
59+
#![feature(decode_utf16)]
5960
#![feature(utf8_error)]
6061
#![cfg_attr(test, feature(rand, test))]
6162

branches/try/src/libcollections/string.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use core::ops::{self, Deref, Add, Index};
2020
use core::ptr;
2121
use core::slice;
2222
use core::str::pattern::Pattern;
23+
use rustc_unicode::char::{decode_utf16, REPLACEMENT_CHARACTER};
2324
use rustc_unicode::str as unicode_str;
24-
use rustc_unicode::str::Utf16Item;
2525

2626
use borrow::{Cow, IntoCow};
2727
use range::RangeArgument;
@@ -267,14 +267,7 @@ impl String {
267267
/// ```
268268
#[stable(feature = "rust1", since = "1.0.0")]
269269
pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error> {
270-
let mut s = String::with_capacity(v.len());
271-
for c in unicode_str::utf16_items(v) {
272-
match c {
273-
Utf16Item::ScalarValue(c) => s.push(c),
274-
Utf16Item::LoneSurrogate(_) => return Err(FromUtf16Error(())),
275-
}
276-
}
277-
Ok(s)
270+
decode_utf16(v.iter().cloned()).collect::<Result<_, _>>().map_err(|_| FromUtf16Error(()))
278271
}
279272

280273
/// Decode a UTF-16 encoded vector `v` into a string, replacing
@@ -294,7 +287,7 @@ impl String {
294287
#[inline]
295288
#[stable(feature = "rust1", since = "1.0.0")]
296289
pub fn from_utf16_lossy(v: &[u16]) -> String {
297-
unicode_str::utf16_items(v).map(|c| c.to_char_lossy()).collect()
290+
decode_utf16(v.iter().cloned()).map(|r| r.unwrap_or(REPLACEMENT_CHARACTER)).collect()
298291
}
299292

300293
/// Creates a new `String` from a length, capacity, and pointer.
@@ -813,11 +806,7 @@ impl<'a> Extend<&'a char> for String {
813806
#[stable(feature = "rust1", since = "1.0.0")]
814807
impl<'a> Extend<&'a str> for String {
815808
fn extend<I: IntoIterator<Item=&'a str>>(&mut self, iterable: I) {
816-
let iterator = iterable.into_iter();
817-
// A guess that at least one byte per iterator element will be needed.
818-
let (lower_bound, _) = iterator.size_hint();
819-
self.reserve(lower_bound);
820-
for s in iterator {
809+
for s in iterable {
821810
self.push_str(s)
822811
}
823812
}

branches/try/src/libcore/any.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
//!
1414
//! `Any` itself can be used to get a `TypeId`, and has more features when used
1515
//! as a trait object. As `&Any` (a borrowed trait object), it has the `is` and
16-
//! `as_ref` methods, to test if the contained value is of a given type, and to
17-
//! get a reference to the inner value as a type. As `&mut Any`, there is also
18-
//! the `as_mut` method, for getting a mutable reference to the inner value.
19-
//! `Box<Any>` adds the `move` method, which will unwrap a `Box<T>` from the
20-
//! object. See the extension traits (`*Ext`) for the full details.
16+
//! `downcast_ref` methods, to test if the contained value is of a given type,
17+
//! and to get a reference to the inner value as a type. As `&mut Any`, there
18+
//! is also the `downcast_mut` method, for getting a mutable reference to the
19+
//! inner value. `Box<Any>` adds the `move` method, which will unwrap a
20+
//! `Box<T>` from the object. See the extension traits (`*Ext`) for the full
21+
//! details.
2122
//!
2223
//! Note that &Any is limited to testing whether a value is of a specified
2324
//! concrete type, and cannot be used to test whether a type implements a trait.

0 commit comments

Comments
 (0)