Skip to content

Commit 04ec8f9

Browse files
author
Nick Hamann
committed
---
yaml --- r: 213880 b: refs/heads/tmp c: 0c22cd7 h: refs/heads/master v: v3
1 parent 044738c commit 04ec8f9

Some content is hidden

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

70 files changed

+477
-1189
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ refs/heads/building: 126db549b038c84269a1e4fe46f051b2c15d6970
3232
refs/heads/beta: e99b1404e9b3f60dc496a8eb0a6ce9fecc7ac583
3333
refs/heads/windistfix: 7608dbad651f02e837ed05eef3d74a6662a6e928
3434
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
35-
refs/heads/tmp: 941af7be24a5c54fd24ba9f0276b97d2c3b53748
35+
refs/heads/tmp: 0c22cd79066f59500eae430abb26b9738d105b99
3636
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3737
refs/tags/homu-tmp: d8a9570154dfbc4032cb3a6ba8b51c6256518dcd
3838
refs/heads/gate: 97c84447b65164731087ea82685580cc81424412

branches/tmp/src/doc/reference.md

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ apply to the crate as a whole.
638638
```
639639

640640
A crate that contains a `main` function can be compiled to an executable. If a
641-
`main` function is present, its return type must be [`unit`](#tuple-types)
641+
`main` function is present, its return type must be [`unit`](#primitive-types)
642642
and it must take no arguments.
643643

644644
# Items and attributes
@@ -928,36 +928,26 @@ A _generic function_ allows one or more _parameterized types_ to appear in its
928928
signature. Each type parameter must be explicitly declared, in an
929929
angle-bracket-enclosed, comma-separated list following the function name.
930930

931-
```rust,ignore
932-
// foo is generic over A and B
933-
934-
fn foo<A, B>(x: A, y: B) {
931+
```{.ignore}
932+
fn iter<T, F>(seq: &[T], f: F) where T: Copy, F: Fn(T) {
933+
for elt in seq { f(*elt); }
934+
}
935+
fn map<T, U, F>(seq: &[T], f: F) -> Vec<U> where T: Copy, U: Copy, F: Fn(T) -> U {
936+
let mut acc = vec![];
937+
for elt in seq { acc.push(f(*elt)); }
938+
acc
939+
}
935940
```
936941

937942
Inside the function signature and body, the name of the type parameter can be
938943
used as a type name. [Trait](#traits) bounds can be specified for type parameters
939944
to allow methods with that trait to be called on values of that type. This is
940-
specified using the `where` syntax:
941-
942-
```rust,ignore
943-
fn foo<T>(x: T) where T: Debug {
944-
```
945+
specified using the `where` syntax, as in the above example.
945946

946947
When a generic function is referenced, its type is instantiated based on the
947-
context of the reference. For example, calling the `foo` function here:
948-
949-
```
950-
use std::fmt::Debug;
951-
952-
fn foo<T>(x: &[T]) where T: Debug {
953-
// details elided
954-
# ()
955-
}
956-
957-
foo(&[1, 2]);
958-
```
959-
960-
will instantiate type parameter `T` with `i32`.
948+
context of the reference. For example, calling the `iter` function defined
949+
above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require
950+
the closure parameter to have type `Fn(i32)`.
961951

962952
The type parameters can also be explicitly supplied in a trailing
963953
[path](#paths) component after the function name. This might be necessary if
@@ -2779,24 +2769,22 @@ meaning of the operators on standard types is given here.
27792769
Like the [arithmetic operators](#arithmetic-operators), bitwise operators are
27802770
syntactic sugar for calls to methods of built-in traits. This means that
27812771
bitwise operators can be overridden for user-defined types. The default
2782-
meaning of the operators on standard types is given here. Bitwise `&`, `|` and
2783-
`^` applied to boolean arguments are equivalent to logical `&&`, `||` and `!=`
2784-
evaluated in non-lazy fashion.
2772+
meaning of the operators on standard types is given here.
27852773

27862774
* `&`
2787-
: Bitwise AND.
2775+
: And.
27882776
Calls the `bitand` method of the `std::ops::BitAnd` trait.
27892777
* `|`
2790-
: Bitwise inclusive OR.
2778+
: Inclusive or.
27912779
Calls the `bitor` method of the `std::ops::BitOr` trait.
27922780
* `^`
2793-
: Bitwise exclusive OR.
2781+
: Exclusive or.
27942782
Calls the `bitxor` method of the `std::ops::BitXor` trait.
27952783
* `<<`
27962784
: Left shift.
27972785
Calls the `shl` method of the `std::ops::Shl` trait.
27982786
* `>>`
2799-
: Right shift (arithmetic).
2787+
: Right shift.
28002788
Calls the `shr` method of the `std::ops::Shr` trait.
28012789

28022790
#### Lazy boolean operators
@@ -2886,7 +2874,7 @@ The `+`, `-`, `*`, `/`, `%`, `&`, `|`, `^`, `<<`, and `>>` operators may be
28862874
composed with the `=` operator. The expression `lval OP= val` is equivalent to
28872875
`lval = lval OP val`. For example, `x = x + 1` may be written as `x += 1`.
28882876

2889-
Any such expression always has the [`unit`](#tuple-types) type.
2877+
Any such expression always has the [`unit`](#primitive-types) type.
28902878

28912879
#### Operator precedence
28922880

@@ -3328,9 +3316,6 @@ assert!(b != "world");
33283316
assert!(p.0 == 10);
33293317
```
33303318

3331-
For historical reasons and convenience, the tuple type with no elements (`()`)
3332-
is often called ‘unit’ or ‘the unit type’.
3333-
33343319
### Array, and Slice types
33353320

33363321
Rust has two different types for a list of items:

branches/tmp/src/doc/trpl/closures.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ let y = &mut num;
120120
```
121121

122122
If your closure requires it, however, Rust will take ownership and move
123-
the environment instead. This doesn’t work:
123+
the environment instead:
124124

125125
```rust,ignore
126126
let nums = vec![1, 2, 3];
@@ -130,7 +130,7 @@ let takes_nums = || nums;
130130
println!("{:?}", nums);
131131
```
132132

133-
We get this error:
133+
This gives us:
134134

135135
```text
136136
note: `nums` moved into closure environment here because it has type

branches/tmp/src/doc/trpl/trait-objects.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,7 @@ let y = TraitObject {
300300
// y.method();
301301
(y.vtable.method)(y.data);
302302
```
303+
304+
If `b` or `y` were owning trait objects (`Box<Foo>`), there would be a
305+
`(b.vtable.destructor)(b.data)` (respectively `y`) call when they went out of
306+
scope.

branches/tmp/src/doc/trpl/traits.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ fn normal<T: ConvertTo<i64>>(x: &T) -> i64 {
332332
fn inverse<T>() -> T
333333
// this is using ConvertTo as if it were "ConvertFrom<i32>"
334334
where i32: ConvertTo<T> {
335-
42.convert()
335+
1i32.convert()
336336
}
337337
```
338338

branches/tmp/src/libcollections/vec.rs

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,26 +1469,42 @@ impl<T> ops::DerefMut for Vec<T> {
14691469
impl<T> FromIterator<T> for Vec<T> {
14701470
#[inline]
14711471
fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> Vec<T> {
1472-
// Unroll the first iteration, as the vector is going to be
1473-
// expanded on this iteration in every case when the iterable is not
1474-
// empty, but the loop in extend_desugared() is not going to see the
1475-
// vector being full in the few subsequent loop iterations.
1476-
// So we get better branch prediction and the possibility to
1477-
// construct the vector with initial estimated capacity.
14781472
let mut iterator = iterable.into_iter();
1479-
let mut vector = match iterator.next() {
1480-
None => return Vec::new(),
1481-
Some(element) => {
1482-
let (lower, _) = iterator.size_hint();
1483-
let mut vector = Vec::with_capacity(1 + lower);
1484-
unsafe {
1485-
ptr::write(vector.get_unchecked_mut(0), element);
1486-
vector.set_len(1);
1487-
}
1488-
vector
1473+
let (lower, _) = iterator.size_hint();
1474+
let mut vector = Vec::with_capacity(lower);
1475+
1476+
// This function should be the moral equivalent of:
1477+
//
1478+
// for item in iterator {
1479+
// vector.push(item);
1480+
// }
1481+
//
1482+
// This equivalent crucially runs the iterator precisely once. Below we
1483+
// actually in theory run the iterator twice (one without bounds checks
1484+
// and one with). To achieve the "moral equivalent", we use the `if`
1485+
// statement below to break out early.
1486+
//
1487+
// If the first loop has terminated, then we have one of two conditions.
1488+
//
1489+
// 1. The underlying iterator returned `None`. In this case we are
1490+
// guaranteed that less than `vector.capacity()` elements have been
1491+
// returned, so we break out early.
1492+
// 2. The underlying iterator yielded `vector.capacity()` elements and
1493+
// has not yielded `None` yet. In this case we run the iterator to
1494+
// its end below.
1495+
for element in iterator.by_ref().take(vector.capacity()) {
1496+
let len = vector.len();
1497+
unsafe {
1498+
ptr::write(vector.get_unchecked_mut(len), element);
1499+
vector.set_len(len + 1);
1500+
}
1501+
}
1502+
1503+
if vector.len() == vector.capacity() {
1504+
for element in iterator {
1505+
vector.push(element);
14891506
}
1490-
};
1491-
vector.extend_desugared(iterator);
1507+
}
14921508
vector
14931509
}
14941510
}
@@ -1553,27 +1569,11 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> {
15531569
impl<T> Extend<T> for Vec<T> {
15541570
#[inline]
15551571
fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
1556-
self.extend_desugared(iterable.into_iter())
1557-
}
1558-
}
1559-
1560-
impl<T> Vec<T> {
1561-
fn extend_desugared<I: Iterator<Item=T>>(&mut self, mut iterator: I) {
1562-
// This function should be the moral equivalent of:
1563-
//
1564-
// for item in iterator {
1565-
// self.push(item);
1566-
// }
1567-
while let Some(element) = iterator.next() {
1568-
let len = self.len();
1569-
if len == self.capacity() {
1570-
let (lower, _) = iterator.size_hint();
1571-
self.reserve(lower + 1);
1572-
}
1573-
unsafe {
1574-
ptr::write(self.get_unchecked_mut(len), element);
1575-
self.set_len(len + 1);
1576-
}
1572+
let iterator = iterable.into_iter();
1573+
let (lower, _) = iterator.size_hint();
1574+
self.reserve(lower);
1575+
for element in iterator {
1576+
self.push(element)
15771577
}
15781578
}
15791579
}

branches/tmp/src/libcore/char.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,17 @@ pub const MAX: char = '\u{10ffff}';
7474
/// ```
7575
/// use std::char;
7676
///
77-
/// assert_eq!(char::from_u32(0x2764), Some('❤'));
78-
/// assert_eq!(char::from_u32(0x110000), None); // invalid character
77+
/// let c = char::from_u32(10084); // produces `Some(❤)`
78+
/// assert_eq!(c, Some('❤'));
79+
/// ```
80+
///
81+
/// An invalid character:
82+
///
83+
/// ```
84+
/// use std::char;
85+
///
86+
/// let none = char::from_u32(1114112);
87+
/// assert_eq!(none, None);
7988
/// ```
8089
#[inline]
8190
#[stable(feature = "rust1", since = "1.0.0")]

branches/tmp/src/librustc/middle/check_const.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ impl<'a, 'tcx> CheckCrateVisitor<'a, 'tcx> {
285285
fn check_static_type(&self, e: &ast::Expr) {
286286
let ty = ty::node_id_to_type(self.tcx, e.id);
287287
let infcx = infer::new_infer_ctxt(self.tcx);
288-
let mut fulfill_cx = traits::FulfillmentContext::new(false);
288+
let mut fulfill_cx = traits::FulfillmentContext::new();
289289
let cause = traits::ObligationCause::new(e.span, e.id, traits::SharedStatic);
290290
fulfill_cx.register_builtin_bound(&infcx, ty, ty::BoundSync, cause);
291291
let env = ty::empty_parameter_environment(self.tcx);

branches/tmp/src/librustc/middle/dead.rs

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ struct MarkSymbolVisitor<'a, 'tcx: 'a> {
4848
struct_has_extern_repr: bool,
4949
ignore_non_const_paths: bool,
5050
inherited_pub_visibility: bool,
51-
ignore_variant_stack: Vec<ast::NodeId>,
5251
}
5352

5453
impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
@@ -61,7 +60,6 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
6160
struct_has_extern_repr: false,
6261
ignore_non_const_paths: false,
6362
inherited_pub_visibility: false,
64-
ignore_variant_stack: vec![],
6563
}
6664
}
6765

@@ -82,9 +80,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
8280
def::DefPrimTy(_) => (),
8381
def::DefVariant(enum_id, variant_id, _) => {
8482
self.check_def_id(enum_id);
85-
if !self.ignore_variant_stack.contains(&variant_id.node) {
86-
self.check_def_id(variant_id);
87-
}
83+
self.check_def_id(variant_id);
8884
}
8985
_ => {
9086
self.check_def_id(def.def_id());
@@ -276,23 +272,6 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
276272
visit::walk_expr(self, expr);
277273
}
278274

279-
fn visit_arm(&mut self, arm: &ast::Arm) {
280-
if arm.pats.len() == 1 {
281-
let pat = &*arm.pats[0];
282-
let variants = pat_util::necessary_variants(&self.tcx.def_map, pat);
283-
284-
// Inside the body, ignore constructions of variants
285-
// necessary for the pattern to match. Those construction sites
286-
// can't be reached unless the variant is constructed elsewhere.
287-
let len = self.ignore_variant_stack.len();
288-
self.ignore_variant_stack.push_all(&*variants);
289-
visit::walk_arm(self, arm);
290-
self.ignore_variant_stack.truncate(len);
291-
} else {
292-
visit::walk_arm(self, arm);
293-
}
294-
}
295-
296275
fn visit_pat(&mut self, pat: &ast::Pat) {
297276
let def_map = &self.tcx.def_map;
298277
match pat.node {
@@ -414,11 +393,6 @@ fn create_and_seed_worklist(tcx: &ty::ctxt,
414393
worklist.push(*id);
415394
}
416395
for id in reachable_symbols {
417-
// Reachable variants can be dead, because we warn about
418-
// variants never constructed, not variants never used.
419-
if let Some(ast_map::NodeVariant(..)) = tcx.map.find(*id) {
420-
continue;
421-
}
422396
worklist.push(*id);
423397
}
424398

branches/tmp/src/librustc/middle/mem_categorization.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub use self::InteriorKind::*;
6565
pub use self::FieldName::*;
6666
pub use self::ElementKind::*;
6767
pub use self::MutabilityCategory::*;
68+
pub use self::InteriorSafety::*;
6869
pub use self::AliasableReason::*;
6970
pub use self::Note::*;
7071
pub use self::deref_kind::*;
@@ -1384,6 +1385,12 @@ impl<'t,'tcx,TYPER:Typer<'tcx>> MemCategorizationContext<'t,TYPER> {
13841385
}
13851386
}
13861387

1388+
#[derive(Copy, Clone, Debug)]
1389+
pub enum InteriorSafety {
1390+
InteriorUnsafe,
1391+
InteriorSafe
1392+
}
1393+
13871394
#[derive(Clone, Debug)]
13881395
pub enum Aliasability {
13891396
FreelyAliasable(AliasableReason),
@@ -1397,8 +1404,8 @@ pub enum AliasableReason {
13971404
AliasableClosure(ast::NodeId), // Aliasable due to capture Fn closure env
13981405
AliasableOther,
13991406
UnaliasableImmutable, // Created as needed upon seeing ImmutableUnique
1400-
AliasableStatic,
1401-
AliasableStaticMut,
1407+
AliasableStatic(InteriorSafety),
1408+
AliasableStaticMut(InteriorSafety),
14021409
}
14031410

14041411
impl<'tcx> cmt_<'tcx> {
@@ -1462,10 +1469,16 @@ impl<'tcx> cmt_<'tcx> {
14621469
}
14631470

14641471
cat_static_item(..) => {
1472+
let int_safe = if ty::type_interior_is_unsafe(ctxt, self.ty) {
1473+
InteriorUnsafe
1474+
} else {
1475+
InteriorSafe
1476+
};
1477+
14651478
if self.mutbl.is_mutable() {
1466-
FreelyAliasable(AliasableStaticMut)
1479+
FreelyAliasable(AliasableStaticMut(int_safe))
14671480
} else {
1468-
FreelyAliasable(AliasableStatic)
1481+
FreelyAliasable(AliasableStatic(int_safe))
14691482
}
14701483
}
14711484

0 commit comments

Comments
 (0)