Skip to content

Commit 1e77849

Browse files
committed
---
yaml --- r: 195447 b: refs/heads/master c: 7afc7d3 h: refs/heads/master i: 195445: 2f319f7 195443: aa218a8 195439: 0a3c4e4 v: v3
1 parent 37cb519 commit 1e77849

File tree

45 files changed

+483
-204
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+483
-204
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 1026b064429f81ed5358abf501098e3aef21d07d
2+
refs/heads/master: 7afc7d3e3566c1e1f8b770cf34ec7e50e045eb69
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: b3317d68910900f135f9f38e43a7a699bc736b4a
55
refs/heads/try: 961e0358e1a5c0faaef606e31e9965742c1643bf

trunk/src/doc/reference.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,12 +1188,15 @@ the guarantee that these issues are never caused by safe code.
11881188

11891189
* Data races
11901190
* Dereferencing a null/dangling raw pointer
1191-
* Mutating an immutable value/reference without `UnsafeCell`
11921191
* Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values)
11931192
(uninitialized) memory
11941193
* Breaking the [pointer aliasing
11951194
rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules)
11961195
with raw pointers (a subset of the rules used by C)
1196+
* `&mut` and `&` follow LLVM’s scoped [noalias] model, except if the `&T`
1197+
contains an `UnsafeCell<U>`. Unsafe code must not violate these aliasing
1198+
guarantees.
1199+
* Mutating an immutable value/reference without `UnsafeCell<U>`
11971200
* Invoking undefined behavior via compiler intrinsics:
11981201
* Indexing outside of the bounds of an object with `std::ptr::offset`
11991202
(`offset` intrinsic), with
@@ -1210,6 +1213,8 @@ the guarantee that these issues are never caused by safe code.
12101213
code. Rust's failure system is not compatible with exception handling in
12111214
other languages. Unwinding must be caught and handled at FFI boundaries.
12121215

1216+
[noalias]: http://llvm.org/docs/LangRef.html#noalias
1217+
12131218
##### Behaviour not considered unsafe
12141219

12151220
This is a list of behaviour not considered *unsafe* in Rust terms, but that may

trunk/src/doc/trpl/ownership.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,10 +472,15 @@ thread-safe counterpart of `Rc<T>`.
472472

473473
## Lifetime Elision
474474

475-
Earlier, we mentioned *lifetime elision*, a feature of Rust which allows you to
476-
not write lifetime annotations in certain circumstances. All references have a
477-
lifetime, and so if you elide a lifetime (like `&T` instead of `&'a T`), Rust
478-
will do three things to determine what those lifetimes should be.
475+
Rust supports powerful local type inference in function bodies, but it’s
476+
forbidden in item signatures to allow reasoning about the types just based in
477+
the item signature alone. However, for ergonomic reasons a very restricted
478+
secondary inference algorithm called “lifetime elision” applies in function
479+
signatures. It infers only based on the signature components themselves and not
480+
based on the body of the function, only infers lifetime paramters, and does
481+
this with only three easily memorizable and unambiguous rules. This makes
482+
lifetime elision a shorthand for writing an item signature, while not hiding
483+
away the actual types involved as full local inference would if applied to it.
479484

480485
When talking about lifetime elision, we use the term *input lifetime* and
481486
*output lifetime*. An *input lifetime* is a lifetime associated with a parameter

trunk/src/doc/trpl/testing.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ pub fn add_two(a: i32) -> i32 {
231231
}
232232
233233
#[cfg(test)]
234-
mod tests {
234+
mod test {
235235
use super::add_two;
236236
237237
#[test]
@@ -241,7 +241,7 @@ mod tests {
241241
}
242242
```
243243

244-
There's a few changes here. The first is the introduction of a `mod tests` with
244+
There's a few changes here. The first is the introduction of a `mod test` with
245245
a `cfg` attribute. The module allows us to group all of our tests together, and
246246
to also define helper functions if needed, that don't become a part of the rest
247247
of our crate. The `cfg` attribute only compiles our test code if we're
@@ -260,7 +260,7 @@ pub fn add_two(a: i32) -> i32 {
260260
}
261261
262262
#[cfg(test)]
263-
mod tests {
263+
mod test {
264264
use super::*;
265265
266266
#[test]

trunk/src/liballoc/heap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ mod imp {
301301
libc::realloc(ptr as *mut libc::c_void, size as libc::size_t) as *mut u8
302302
} else {
303303
let new_ptr = allocate(size, align);
304-
ptr::copy(new_ptr, ptr, cmp::min(size, old_size));
304+
ptr::copy(ptr, new_ptr, cmp::min(size, old_size));
305305
deallocate(ptr, old_size, align);
306306
new_ptr
307307
}

trunk/src/libcollections/btree/node.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,13 +1133,13 @@ impl<K, V> Node<K, V> {
11331133
#[inline]
11341134
unsafe fn insert_kv(&mut self, index: usize, key: K, val: V) -> &mut V {
11351135
ptr::copy(
1136-
self.keys_mut().as_mut_ptr().offset(index as isize + 1),
11371136
self.keys().as_ptr().offset(index as isize),
1137+
self.keys_mut().as_mut_ptr().offset(index as isize + 1),
11381138
self.len() - index
11391139
);
11401140
ptr::copy(
1141-
self.vals_mut().as_mut_ptr().offset(index as isize + 1),
11421141
self.vals().as_ptr().offset(index as isize),
1142+
self.vals_mut().as_mut_ptr().offset(index as isize + 1),
11431143
self.len() - index
11441144
);
11451145

@@ -1155,8 +1155,8 @@ impl<K, V> Node<K, V> {
11551155
#[inline]
11561156
unsafe fn insert_edge(&mut self, index: usize, edge: Node<K, V>) {
11571157
ptr::copy(
1158-
self.edges_mut().as_mut_ptr().offset(index as isize + 1),
11591158
self.edges().as_ptr().offset(index as isize),
1159+
self.edges_mut().as_mut_ptr().offset(index as isize + 1),
11601160
self.len() - index
11611161
);
11621162
ptr::write(self.edges_mut().get_unchecked_mut(index), edge);
@@ -1188,13 +1188,13 @@ impl<K, V> Node<K, V> {
11881188
let val = ptr::read(self.vals().get_unchecked(index));
11891189

11901190
ptr::copy(
1191-
self.keys_mut().as_mut_ptr().offset(index as isize),
11921191
self.keys().as_ptr().offset(index as isize + 1),
1192+
self.keys_mut().as_mut_ptr().offset(index as isize),
11931193
self.len() - index - 1
11941194
);
11951195
ptr::copy(
1196-
self.vals_mut().as_mut_ptr().offset(index as isize),
11971196
self.vals().as_ptr().offset(index as isize + 1),
1197+
self.vals_mut().as_mut_ptr().offset(index as isize),
11981198
self.len() - index - 1
11991199
);
12001200

@@ -1209,8 +1209,8 @@ impl<K, V> Node<K, V> {
12091209
let edge = ptr::read(self.edges().get_unchecked(index));
12101210

12111211
ptr::copy(
1212-
self.edges_mut().as_mut_ptr().offset(index as isize),
12131212
self.edges().as_ptr().offset(index as isize + 1),
1213+
self.edges_mut().as_mut_ptr().offset(index as isize),
12141214
// index can be == len+1, so do the +1 first to avoid underflow.
12151215
(self.len() + 1) - index
12161216
);
@@ -1237,19 +1237,19 @@ impl<K, V> Node<K, V> {
12371237
right._len = self.len() / 2;
12381238
let right_offset = self.len() - right.len();
12391239
ptr::copy_nonoverlapping(
1240-
right.keys_mut().as_mut_ptr(),
12411240
self.keys().as_ptr().offset(right_offset as isize),
1241+
right.keys_mut().as_mut_ptr(),
12421242
right.len()
12431243
);
12441244
ptr::copy_nonoverlapping(
1245-
right.vals_mut().as_mut_ptr(),
12461245
self.vals().as_ptr().offset(right_offset as isize),
1246+
right.vals_mut().as_mut_ptr(),
12471247
right.len()
12481248
);
12491249
if !self.is_leaf() {
12501250
ptr::copy_nonoverlapping(
1251-
right.edges_mut().as_mut_ptr(),
12521251
self.edges().as_ptr().offset(right_offset as isize),
1252+
right.edges_mut().as_mut_ptr(),
12531253
right.len() + 1
12541254
);
12551255
}
@@ -1278,19 +1278,19 @@ impl<K, V> Node<K, V> {
12781278
ptr::write(self.vals_mut().get_unchecked_mut(old_len), val);
12791279

12801280
ptr::copy_nonoverlapping(
1281-
self.keys_mut().as_mut_ptr().offset(old_len as isize + 1),
12821281
right.keys().as_ptr(),
1282+
self.keys_mut().as_mut_ptr().offset(old_len as isize + 1),
12831283
right.len()
12841284
);
12851285
ptr::copy_nonoverlapping(
1286-
self.vals_mut().as_mut_ptr().offset(old_len as isize + 1),
12871286
right.vals().as_ptr(),
1287+
self.vals_mut().as_mut_ptr().offset(old_len as isize + 1),
12881288
right.len()
12891289
);
12901290
if !self.is_leaf() {
12911291
ptr::copy_nonoverlapping(
1292-
self.edges_mut().as_mut_ptr().offset(old_len as isize + 1),
12931292
right.edges().as_ptr(),
1293+
self.edges_mut().as_mut_ptr().offset(old_len as isize + 1),
12941294
right.len() + 1
12951295
);
12961296
}

trunk/src/libcollections/slice.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,10 +1320,10 @@ fn insertion_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> O
13201320

13211321
if i != j {
13221322
let tmp = ptr::read(read_ptr);
1323-
ptr::copy(buf_v.offset(j + 1),
1324-
&*buf_v.offset(j),
1323+
ptr::copy(&*buf_v.offset(j),
1324+
buf_v.offset(j + 1),
13251325
(i - j) as usize);
1326-
ptr::copy_nonoverlapping(buf_v.offset(j), &tmp, 1);
1326+
ptr::copy_nonoverlapping(&tmp, buf_v.offset(j), 1);
13271327
mem::forget(tmp);
13281328
}
13291329
}
@@ -1396,10 +1396,10 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
13961396
// j + 1 could be `len` (for the last `i`), but in
13971397
// that case, `i == j` so we don't copy. The
13981398
// `.offset(j)` is always in bounds.
1399-
ptr::copy(buf_dat.offset(j + 1),
1400-
&*buf_dat.offset(j),
1399+
ptr::copy(&*buf_dat.offset(j),
1400+
buf_dat.offset(j + 1),
14011401
i - j as usize);
1402-
ptr::copy_nonoverlapping(buf_dat.offset(j), read_ptr, 1);
1402+
ptr::copy_nonoverlapping(read_ptr, buf_dat.offset(j), 1);
14031403
}
14041404
}
14051405
}
@@ -1447,11 +1447,11 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
14471447
if left == right_start {
14481448
// the number remaining in this run.
14491449
let elems = (right_end as usize - right as usize) / mem::size_of::<T>();
1450-
ptr::copy_nonoverlapping(out, &*right, elems);
1450+
ptr::copy_nonoverlapping(&*right, out, elems);
14511451
break;
14521452
} else if right == right_end {
14531453
let elems = (right_start as usize - left as usize) / mem::size_of::<T>();
1454-
ptr::copy_nonoverlapping(out, &*left, elems);
1454+
ptr::copy_nonoverlapping(&*left, out, elems);
14551455
break;
14561456
}
14571457

@@ -1465,7 +1465,7 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
14651465
} else {
14661466
step(&mut left)
14671467
};
1468-
ptr::copy_nonoverlapping(out, &*to_copy, 1);
1468+
ptr::copy_nonoverlapping(&*to_copy, out, 1);
14691469
step(&mut out);
14701470
}
14711471
}
@@ -1479,7 +1479,7 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
14791479
// write the result to `v` in one go, so that there are never two copies
14801480
// of the same object in `v`.
14811481
unsafe {
1482-
ptr::copy_nonoverlapping(v.as_mut_ptr(), &*buf_dat, len);
1482+
ptr::copy_nonoverlapping(&*buf_dat, v.as_mut_ptr(), len);
14831483
}
14841484

14851485
// increment the pointer, returning the old pointer.

trunk/src/libcollections/string.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -592,8 +592,8 @@ impl String {
592592
let ch = self.char_at(idx);
593593
let next = idx + ch.len_utf8();
594594
unsafe {
595-
ptr::copy(self.vec.as_mut_ptr().offset(idx as isize),
596-
self.vec.as_ptr().offset(next as isize),
595+
ptr::copy(self.vec.as_ptr().offset(next as isize),
596+
self.vec.as_mut_ptr().offset(idx as isize),
597597
len - next);
598598
self.vec.set_len(len - (next - idx));
599599
}
@@ -622,11 +622,11 @@ impl String {
622622
let amt = ch.encode_utf8(&mut bits).unwrap();
623623

624624
unsafe {
625-
ptr::copy(self.vec.as_mut_ptr().offset((idx + amt) as isize),
626-
self.vec.as_ptr().offset(idx as isize),
625+
ptr::copy(self.vec.as_ptr().offset(idx as isize),
626+
self.vec.as_mut_ptr().offset((idx + amt) as isize),
627627
len - idx);
628-
ptr::copy(self.vec.as_mut_ptr().offset(idx as isize),
629-
bits.as_ptr(),
628+
ptr::copy(bits.as_ptr(),
629+
self.vec.as_mut_ptr().offset(idx as isize),
630630
amt);
631631
self.vec.set_len(len + amt);
632632
}
@@ -1019,27 +1019,44 @@ impl AsRef<str> for String {
10191019

10201020
#[stable(feature = "rust1", since = "1.0.0")]
10211021
impl<'a> From<&'a str> for String {
1022+
#[inline]
10221023
fn from(s: &'a str) -> String {
10231024
s.to_string()
10241025
}
10251026
}
10261027

1028+
#[stable(feature = "rust1", since = "1.0.0")]
1029+
impl<'a> From<&'a str> for Cow<'a, str> {
1030+
#[inline]
1031+
fn from(s: &'a str) -> Cow<'a, str> {
1032+
Cow::Borrowed(s)
1033+
}
1034+
}
1035+
1036+
#[stable(feature = "rust1", since = "1.0.0")]
1037+
impl<'a> From<String> for Cow<'a, str> {
1038+
#[inline]
1039+
fn from(s: String) -> Cow<'a, str> {
1040+
Cow::Owned(s)
1041+
}
1042+
}
1043+
10271044
#[stable(feature = "rust1", since = "1.0.0")]
10281045
impl Into<Vec<u8>> for String {
10291046
fn into(self) -> Vec<u8> {
10301047
self.into_bytes()
10311048
}
10321049
}
10331050

1034-
#[stable(feature = "rust1", since = "1.0.0")]
1051+
#[unstable(feature = "into_cow", reason = "may be replaced by `convert::Into`")]
10351052
impl IntoCow<'static, str> for String {
10361053
#[inline]
10371054
fn into_cow(self) -> Cow<'static, str> {
10381055
Cow::Owned(self)
10391056
}
10401057
}
10411058

1042-
#[stable(feature = "rust1", since = "1.0.0")]
1059+
#[unstable(feature = "into_cow", reason = "may be replaced by `convert::Into`")]
10431060
impl<'a> IntoCow<'a, str> for &'a str {
10441061
#[inline]
10451062
fn into_cow(self) -> Cow<'a, str> {

trunk/src/libcollections/vec.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,17 @@ impl<T> Vec<T> {
260260

261261
/// Creates a vector by copying the elements from a raw pointer.
262262
///
263-
/// This function will copy `elts` contiguous elements starting at `ptr` into a new allocation
264-
/// owned by the returned `Vec<T>`. The elements of the buffer are copied into the vector
265-
/// without cloning, as if `ptr::read()` were called on them.
263+
/// This function will copy `elts` contiguous elements starting at `ptr`
264+
/// into a new allocation owned by the returned `Vec<T>`. The elements of
265+
/// the buffer are copied into the vector without cloning, as if
266+
/// `ptr::read()` were called on them.
266267
#[inline]
267268
#[unstable(feature = "collections",
268269
reason = "may be better expressed via composition")]
269270
pub unsafe fn from_raw_buf(ptr: *const T, elts: usize) -> Vec<T> {
270271
let mut dst = Vec::with_capacity(elts);
271272
dst.set_len(elts);
272-
ptr::copy_nonoverlapping(dst.as_mut_ptr(), ptr, elts);
273+
ptr::copy_nonoverlapping(ptr, dst.as_mut_ptr(), elts);
273274
dst
274275
}
275276

@@ -288,8 +289,9 @@ impl<T> Vec<T> {
288289
self.cap
289290
}
290291

291-
/// Reserves capacity for at least `additional` more elements to be inserted in the given
292-
/// `Vec<T>`. The collection may reserve more space to avoid frequent reallocations.
292+
/// Reserves capacity for at least `additional` more elements to be inserted
293+
/// in the given `Vec<T>`. The collection may reserve more space to avoid
294+
/// frequent reallocations.
293295
///
294296
/// # Panics
295297
///
@@ -541,7 +543,7 @@ impl<T> Vec<T> {
541543
let p = self.as_mut_ptr().offset(index as isize);
542544
// Shift everything over to make space. (Duplicating the
543545
// `index`th element into two consecutive places.)
544-
ptr::copy(p.offset(1), &*p, len - index);
546+
ptr::copy(&*p, p.offset(1), len - index);
545547
// Write it in, overwriting the first copy of the `index`th
546548
// element.
547549
ptr::write(&mut *p, element);
@@ -579,7 +581,7 @@ impl<T> Vec<T> {
579581
ret = ptr::read(ptr);
580582

581583
// Shift everything down to fill in that spot.
582-
ptr::copy(ptr, &*ptr.offset(1), len - index - 1);
584+
ptr::copy(&*ptr.offset(1), ptr, len - index - 1);
583585
}
584586
self.set_len(len - 1);
585587
ret
@@ -721,8 +723,8 @@ impl<T> Vec<T> {
721723
let len = self.len();
722724
unsafe {
723725
ptr::copy_nonoverlapping(
724-
self.get_unchecked_mut(len),
725726
other.as_ptr(),
727+
self.get_unchecked_mut(len),
726728
other.len());
727729
}
728730

@@ -1042,8 +1044,8 @@ impl<T> Vec<T> {
10421044
other.set_len(other_len);
10431045

10441046
ptr::copy_nonoverlapping(
1045-
other.as_mut_ptr(),
10461047
self.as_ptr().offset(at as isize),
1048+
other.as_mut_ptr(),
10471049
other.len());
10481050
}
10491051
other

0 commit comments

Comments
 (0)