Skip to content

Commit b75f535

Browse files
committed
---
yaml --- r: 194815 b: refs/heads/auto c: 6968ccf h: refs/heads/master i: 194813: dc63d4f 194811: 4fe4633 194807: 2873762 194799: e05eaa1 194783: f376225 194751: 77f494d 194687: 51a3410 194559: 544d690 v: v3
1 parent 78632c2 commit b75f535

File tree

296 files changed

+3967
-1485
lines changed

Some content is hidden

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

296 files changed

+3967
-1485
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1010
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1111
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1212
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
13-
refs/heads/auto: 4c2ddb33ad9e2dbfc3713438472ca85cb5aefd07
13+
refs/heads/auto: 6968ccfd7a9a8f568959defe7408532d8607a0bb
1414
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1515
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
1616
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336

branches/auto/mk/tests.mk

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,11 @@ ifeq ($(CFG_OSTYPE),apple-darwin)
569569
CTEST_DISABLE_debuginfo-gdb = "gdb on darwin needs root"
570570
endif
571571

572+
ifeq ($(findstring android, $(CFG_TARGET)), android)
573+
CTEST_DISABLE_debuginfo-gdb =
574+
CTEST_DISABLE_debuginfo-lldb = "lldb tests are disabled on android"
575+
endif
576+
572577
# CTEST_DISABLE_NONSELFHOST_$(TEST_GROUP), if set, will cause that
573578
# test group to be disabled *unless* the target is able to build a
574579
# compiler (i.e. when the target triple is in the set of of host

branches/auto/src/doc/reference.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,7 +1265,7 @@ be undesired.
12651265
* Sending signals
12661266
* Accessing/modifying the file system
12671267
* Unsigned integer overflow (well-defined as wrapping)
1268-
* Signed integer overflow (well-defined as two's complement representation
1268+
* Signed integer overflow (well-defined as twos complement representation
12691269
wrapping)
12701270

12711271
#### Diverging functions
@@ -2961,10 +2961,10 @@ meaning of the operators on standard types is given here.
29612961
: Exclusive or.
29622962
Calls the `bitxor` method of the `std::ops::BitXor` trait.
29632963
* `<<`
2964-
: Logical left shift.
2964+
: Left shift.
29652965
Calls the `shl` method of the `std::ops::Shl` trait.
29662966
* `>>`
2967-
: Logical right shift.
2967+
: Right shift.
29682968
Calls the `shr` method of the `std::ops::Shr` trait.
29692969

29702970
#### Lazy boolean operators

branches/auto/src/doc/trpl/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* [More Strings](more-strings.md)
2323
* [Patterns](patterns.md)
2424
* [Method Syntax](method-syntax.md)
25+
* [Associated Types](associated-types.md)
2526
* [Closures](closures.md)
2627
* [Iterators](iterators.md)
2728
* [Generics](generics.md)
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
% Associated Types
2+
3+
Associated types are a powerful part of Rust's type system. They're related to
4+
the idea of a 'type family', in other words, grouping multiple types together. That
5+
description is a bit abstract, so let's dive right into an example. If you want
6+
to write a `Graph` trait, you have two types to be generic over: the node type
7+
and the edge type. So you might write a trait, `Graph<N, E>`, that looks like
8+
this:
9+
10+
```rust
11+
trait Graph<N, E> {
12+
fn has_edge(&self, &N, &N) -> bool;
13+
fn edges(&self, &N) -> Vec<E>;
14+
// etc
15+
}
16+
```
17+
18+
While this sort of works, it ends up being awkward. For example, any function
19+
that wants to take a `Graph` as a parameter now _also_ needs to be generic over
20+
the `N`ode and `E`dge types too:
21+
22+
```rust,ignore
23+
fn distance<N, E, G: Graph<N, E>>(graph: &G, start: &N, end: &N) -> u32 { ... }
24+
```
25+
26+
Our distance calculation works regardless of our `Edge` type, so the `E` stuff in
27+
this signature is just a distraction.
28+
29+
What we really want to say is that a certain `E`dge and `N`ode type come together
30+
to form each kind of `Graph`. We can do that with associated types:
31+
32+
```rust
33+
trait Graph {
34+
type N;
35+
type E;
36+
37+
fn has_edge(&self, &Self::N, &Self::N) -> bool;
38+
fn edges(&self, &Self::N) -> Vec<Self::E>;
39+
// etc
40+
}
41+
```
42+
43+
Now, our clients can be abstract over a given `Graph`:
44+
45+
```rust,ignore
46+
fn distance<G: Graph>(graph: &G, start: &G::N, end: &G::N) -> uint { ... }
47+
```
48+
49+
No need to deal with the `E`dge type here!
50+
51+
Let's go over all this in more detail.
52+
53+
## Defining associated types
54+
55+
Let's build that `Graph` trait. Here's the definition:
56+
57+
```rust
58+
trait Graph {
59+
type N;
60+
type E;
61+
62+
fn has_edge(&self, &Self::N, &Self::N) -> bool;
63+
fn edges(&self, &Self::N) -> Vec<Self::E>;
64+
}
65+
```
66+
67+
Simple enough. Associated types use the `type` keyword, and go inside the body
68+
of the trait, with the functions.
69+
70+
These `type` declarations can have all the same thing as functions do. For example,
71+
if we wanted our `N` type to implement `Display`, so we can print the nodes out,
72+
we could do this:
73+
74+
```rust
75+
use std::fmt;
76+
77+
trait Graph {
78+
type N: fmt::Display;
79+
type E;
80+
81+
fn has_edge(&self, &Self::N, &Self::N) -> bool;
82+
fn edges(&self, &Self::N) -> Vec<Self::E>;
83+
}
84+
```
85+
86+
## Implementing associated types
87+
88+
Just like any trait, traits that use associated types use the `impl` keyword to
89+
provide implementations. Here's a simple implementation of Graph:
90+
91+
```rust
92+
# trait Graph {
93+
# type N;
94+
# type E;
95+
# fn has_edge(&self, &Self::N, &Self::N) -> bool;
96+
# fn edges(&self, &Self::N) -> Vec<Self::E>;
97+
# }
98+
struct Node;
99+
100+
struct Edge;
101+
102+
struct MyGraph;
103+
104+
impl Graph for MyGraph {
105+
type N = Node;
106+
type E = Edge;
107+
108+
fn has_edge(&self, n1: &Node, n2: &Node) -> bool {
109+
true
110+
}
111+
112+
fn edges(&self, n: &Node) -> Vec<Edge> {
113+
Vec::new()
114+
}
115+
}
116+
```
117+
118+
This silly implementation always returns `true` and an empty `Vec<Edge>`, but it
119+
gives you an idea of how to implement this kind of thing. We first need three
120+
`struct`s, one for the graph, one for the node, and one for the edge. If it made
121+
more sense to use a different type, that would work as well, we're just going to
122+
use `struct`s for all three here.
123+
124+
Next is the `impl` line, which is just like implementing any other trait.
125+
126+
From here, we use `=` to define our associated types. The name the trait uses
127+
goes on the left of the `=`, and the concrete type we're `impl`ementing this
128+
for goes on the right. Finally, we use the concrete types in our function
129+
declarations.
130+
131+
## Trait objects with associated types
132+
133+
There’s one more bit of syntax we should talk about: trait objects. If you
134+
try to create a trait object from an associated type, like this:
135+
136+
```rust,ignore
137+
# trait Graph {
138+
# type N;
139+
# type E;
140+
# fn has_edge(&self, &Self::N, &Self::N) -> bool;
141+
# fn edges(&self, &Self::N) -> Vec<Self::E>;
142+
# }
143+
# struct Node;
144+
# struct Edge;
145+
# struct MyGraph;
146+
# impl Graph for MyGraph {
147+
# type N = Node;
148+
# type E = Edge;
149+
# fn has_edge(&self, n1: &Node, n2: &Node) -> bool {
150+
# true
151+
# }
152+
# fn edges(&self, n: &Node) -> Vec<Edge> {
153+
# Vec::new()
154+
# }
155+
# }
156+
let graph = MyGraph;
157+
let obj = Box::new(graph) as Box<Graph>;
158+
```
159+
160+
You’ll get two errors:
161+
162+
```text
163+
error: the value of the associated type `E` (from the trait `main::Graph`) must
164+
be specified [E0191]
165+
let obj = Box::new(graph) as Box<Graph>;
166+
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167+
24:44 error: the value of the associated type `N` (from the trait
168+
`main::Graph`) must be specified [E0191]
169+
let obj = Box::new(graph) as Box<Graph>;
170+
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171+
```
172+
173+
We can’t create a trait object like this, becuase we don’t know the associated
174+
types. Instead, we can write this:
175+
176+
```rust
177+
# trait Graph {
178+
# type N;
179+
# type E;
180+
# fn has_edge(&self, &Self::N, &Self::N) -> bool;
181+
# fn edges(&self, &Self::N) -> Vec<Self::E>;
182+
# }
183+
# struct Node;
184+
# struct Edge;
185+
# struct MyGraph;
186+
# impl Graph for MyGraph {
187+
# type N = Node;
188+
# type E = Edge;
189+
# fn has_edge(&self, n1: &Node, n2: &Node) -> bool {
190+
# true
191+
# }
192+
# fn edges(&self, n: &Node) -> Vec<Edge> {
193+
# Vec::new()
194+
# }
195+
# }
196+
let graph = MyGraph;
197+
let obj = Box::new(graph) as Box<Graph<N=Node, E=Edge>>;
198+
```
199+
200+
The `N=Node` syntax allows us to provide a concrete type, `Node`, for the `N`
201+
type parameter. Same with `E=Edge`. If we didn’t proide this constraint, we
202+
couldn’t be sure which `impl` to match this trait object to.

branches/auto/src/doc/trpl/ownership.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,8 @@ Otherwise, it is an error to elide an output lifetime.
513513

514514
### Examples
515515

516-
Here are some examples of functions with elided lifetimes, and the version of
517-
what the elided lifetimes are expand to:
516+
Here are some examples of functions with elided lifetimes. We've paired each
517+
example of an elided lifetime with its expanded form.
518518

519519
```{rust,ignore}
520520
fn print(s: &str); // elided

branches/auto/src/doc/trpl/unsafe.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,16 @@ use std::ptr;
197197
198198
// Define a wrapper around the handle returned by the foreign code.
199199
// Unique<T> has the same semantics as Box<T>
200-
pub struct Unique<T> {
200+
//
201+
// NB: For simplicity and correctness, we require that T has kind Send
202+
// (owned boxes relax this restriction).
203+
pub struct Unique<T: Send> {
201204
// It contains a single raw, mutable pointer to the object in question.
202205
ptr: *mut T
203206
}
204207
205208
// Implement methods for creating and using the values in the box.
206209
207-
// NB: For simplicity and correctness, we require that T has kind Send
208-
// (owned boxes relax this restriction).
209210
impl<T: Send> Unique<T> {
210211
pub fn new(value: T) -> Unique<T> {
211212
unsafe {
@@ -239,11 +240,11 @@ impl<T: Send> Unique<T> {
239240
// Unique<T>, making the struct manage the raw pointer: when the
240241
// struct goes out of scope, it will automatically free the raw pointer.
241242
//
242-
// NB: This is an unsafe destructor, because rustc will not normally
243-
// allow destructors to be associated with parameterized types, due to
244-
// bad interaction with managed boxes. (With the Send restriction,
245-
// we don't have this problem.) Note that the `#[unsafe_destructor]`
246-
// feature gate is required to use unsafe destructors.
243+
// NB: This is an unsafe destructor; rustc will not normally allow
244+
// destructors to be associated with parameterized types (due to
245+
// historically failing to check them soundly). Note that the
246+
// `#[unsafe_destructor]` feature gate is currently required to use
247+
// unsafe destructors.
247248
#[unsafe_destructor]
248249
impl<T: Send> Drop for Unique<T> {
249250
fn drop(&mut self) {

branches/auto/src/etc/libc.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,16 @@ void posix88_consts() {
165165
put_const(S_IWUSR, int);
166166
put_const(S_IRUSR, int);
167167

168+
put_const(S_IRWXG, int);
169+
put_const(S_IXGRP, int);
170+
put_const(S_IWGRP, int);
171+
put_const(S_IRGRP, int);
172+
173+
put_const(S_IRWXO, int);
174+
put_const(S_IXOTH, int);
175+
put_const(S_IWOTH, int);
176+
put_const(S_IROTH, int);
177+
168178
#ifdef F_OK
169179
put_const(F_OK, int);
170180
#endif

branches/auto/src/liballoc/arc.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ impl<T: Send + Sync + Clone> Arc<T> {
321321

322322
#[unsafe_destructor]
323323
#[stable(feature = "rust1", since = "1.0.0")]
324-
impl<T: Sync + Send> Drop for Arc<T> {
324+
impl<T> Drop for Arc<T> {
325325
/// Drops the `Arc<T>`.
326326
///
327327
/// This will decrement the strong reference count. If the strong reference
@@ -354,7 +354,8 @@ impl<T: Sync + Send> Drop for Arc<T> {
354354
// more than once (but it is guaranteed to be zeroed after the first if
355355
// it's run more than once)
356356
let ptr = *self._ptr;
357-
if ptr.is_null() { return }
357+
// if ptr.is_null() { return }
358+
if ptr.is_null() || ptr as usize == mem::POST_DROP_USIZE { return }
358359

359360
// Because `fetch_sub` is already atomic, we do not need to synchronize
360361
// with other threads unless we are going to delete the object. This
@@ -388,7 +389,7 @@ impl<T: Sync + Send> Drop for Arc<T> {
388389

389390
#[unstable(feature = "alloc",
390391
reason = "Weak pointers may not belong in this module.")]
391-
impl<T: Sync + Send> Weak<T> {
392+
impl<T> Weak<T> {
392393
/// Upgrades a weak reference to a strong reference.
393394
///
394395
/// Upgrades the `Weak<T>` reference to an `Arc<T>`, if possible.
@@ -454,7 +455,7 @@ impl<T: Sync + Send> Clone for Weak<T> {
454455

455456
#[unsafe_destructor]
456457
#[stable(feature = "rust1", since = "1.0.0")]
457-
impl<T: Sync + Send> Drop for Weak<T> {
458+
impl<T> Drop for Weak<T> {
458459
/// Drops the `Weak<T>`.
459460
///
460461
/// This will decrement the weak reference count.
@@ -485,7 +486,7 @@ impl<T: Sync + Send> Drop for Weak<T> {
485486
let ptr = *self._ptr;
486487

487488
// see comments above for why this check is here
488-
if ptr.is_null() { return }
489+
if ptr.is_null() || ptr as usize == mem::POST_DROP_USIZE { return }
489490

490491
// If we find out that we were the last weak pointer, then its time to
491492
// deallocate the data entirely. See the discussion in Arc::drop() about

branches/auto/src/liballoc/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
#![feature(box_syntax)]
7676
#![feature(optin_builtin_traits)]
7777
#![feature(unboxed_closures)]
78-
#![feature(unsafe_no_drop_flag)]
78+
#![feature(unsafe_no_drop_flag, filling_drop)]
7979
#![feature(core)]
8080
#![feature(unique)]
8181
#![cfg_attr(test, feature(test, alloc, rustc_private))]

0 commit comments

Comments
 (0)