Skip to content

Commit a19bb31

Browse files
committed
---
yaml --- r: 232546 b: refs/heads/try c: 3a407b6 h: refs/heads/master v: v3
1 parent d88949c commit a19bb31

File tree

20 files changed

+391
-100
lines changed

20 files changed

+391
-100
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: 7c06c5a90015a73cdcb6cd6b6243bc99fcd9d357
4+
refs/heads/try: 3a407b6c4eea5d7bff34abf42518bcb8379c0cfb
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
66
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
77
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,28 @@ Read ["Installing Rust"] from [The Book].
8282
$ make && make install
8383
```
8484

85+
## Building Documentation
86+
87+
If you’d like to build the documentation, it’s almost the same:
88+
89+
```sh
90+
./configure
91+
$ make docs
92+
```
93+
94+
Building the documentation requires building the compiler, so the above
95+
details will apply. Once you have the compiler built, you can
96+
97+
```sh
98+
$ make docs NO_REBUILD=1
99+
```
100+
101+
To make sure you don’t re-build the compiler because you made a change
102+
to some documentation.
103+
104+
The generated documentation will appear in a top-level `doc` directory,
105+
created by the `make` rule.
106+
85107
## Notes
86108

87109
Since the Rust compiler is written in Rust, it must be built by a

branches/try/man/rustc.1

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ look for anything here (the default)
4141
.RE
4242
.TP
4343
\fB\-l\fR [\fIKIND\fR=]\fINAME\fR
44-
Link the generated crate(s) to the specified native library \fINAME\fR.
44+
Link the generated crate(s) to the specified library \fINAME\fR.
4545
The optional \fIKIND\fR can be one of \fIstatic\fR, \fIdylib\fR, or
4646
\fIframework\fR.
4747
If omitted, \fIdylib\fR is assumed.
@@ -113,7 +113,8 @@ Print version info and exit.
113113
Use verbose output.
114114
.TP
115115
\fB\-\-extern\fR \fINAME\fR=\fIPATH\fR
116-
Specify where an external rust library is located.
116+
Specify where an external rust library is located. These should match
117+
\fIextern\fR declarations in the crate's source code.
117118
.TP
118119
\fB\-\-sysroot\fR \fIPATH\fR
119120
Override the system root.

branches/try/src/doc/reference.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,6 +2059,11 @@ The following configurations must be defined by the implementation:
20592059
`"mips"`, `"powerpc"`, `"arm"`, or `"aarch64"`.
20602060
* `target_endian = "..."`. Endianness of the target CPU, either `"little"` or
20612061
`"big"`.
2062+
* `target_env = ".."` - an option provided by the compiler by default
2063+
describing the runtime environment of the target platform. Some examples of
2064+
this are `musl` for builds targeting the MUSL libc implementation, `msvc` for
2065+
Windows builds targeting MSVC, and `gnu` frequently the rest of the time. This
2066+
option may also be blank on some platforms.
20622067
* `target_family = "..."`. Operating system family of the target, e. g.
20632068
`"unix"` or `"windows"`. The value of this configuration option is defined
20642069
as a configuration itself, like `unix` or `windows`.

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

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,61 @@ fn diverges() -> ! {
214214

215215
`panic!` is a macro, similar to `println!()` that we’ve already seen. Unlike
216216
`println!()`, `panic!()` causes the current thread of execution to crash with
217-
the given message.
217+
the given message. Because this function will cause a crash, it will never
218+
return, and so it has the type ‘`!`’, which is read ‘diverges’.
218219

219-
Because this function will cause a crash, it will never return, and so it has
220-
the type ‘`!`’, which is read ‘diverges’. A diverging function can be used
221-
as any type:
220+
If you add a main function that calls `diverges()` and run it, you’ll get
221+
some output that looks like this:
222+
223+
```text
224+
thread ‘<main>’ panicked at ‘This function never returns!’, hello.rs:2
225+
```
226+
227+
If you want more information, you can get a backtrace by setting the
228+
`RUST_BACKTRACE` environment variable:
229+
230+
```text
231+
$ RUST_BACKTRACE=1 ./diverges
232+
thread '<main>' panicked at 'This function never returns!', hello.rs:2
233+
stack backtrace:
234+
1: 0x7f402773a829 - sys::backtrace::write::h0942de78b6c02817K8r
235+
2: 0x7f402773d7fc - panicking::on_panic::h3f23f9d0b5f4c91bu9w
236+
3: 0x7f402773960e - rt::unwind::begin_unwind_inner::h2844b8c5e81e79558Bw
237+
4: 0x7f4027738893 - rt::unwind::begin_unwind::h4375279447423903650
238+
5: 0x7f4027738809 - diverges::h2266b4c4b850236beaa
239+
6: 0x7f40277389e5 - main::h19bb1149c2f00ecfBaa
240+
7: 0x7f402773f514 - rt::unwind::try::try_fn::h13186883479104382231
241+
8: 0x7f402773d1d8 - __rust_try
242+
9: 0x7f402773f201 - rt::lang_start::ha172a3ce74bb453aK5w
243+
10: 0x7f4027738a19 - main
244+
11: 0x7f402694ab44 - __libc_start_main
245+
12: 0x7f40277386c8 - <unknown>
246+
13: 0x0 - <unknown>
247+
```
248+
249+
`RUST_BACKTRACE` also works with Cargo’s `run` command:
250+
251+
```text
252+
$ RUST_BACKTRACE=1 cargo run
253+
Running `target/debug/diverges`
254+
thread '<main>' panicked at 'This function never returns!', hello.rs:2
255+
stack backtrace:
256+
1: 0x7f402773a829 - sys::backtrace::write::h0942de78b6c02817K8r
257+
2: 0x7f402773d7fc - panicking::on_panic::h3f23f9d0b5f4c91bu9w
258+
3: 0x7f402773960e - rt::unwind::begin_unwind_inner::h2844b8c5e81e79558Bw
259+
4: 0x7f4027738893 - rt::unwind::begin_unwind::h4375279447423903650
260+
5: 0x7f4027738809 - diverges::h2266b4c4b850236beaa
261+
6: 0x7f40277389e5 - main::h19bb1149c2f00ecfBaa
262+
7: 0x7f402773f514 - rt::unwind::try::try_fn::h13186883479104382231
263+
8: 0x7f402773d1d8 - __rust_try
264+
9: 0x7f402773f201 - rt::lang_start::ha172a3ce74bb453aK5w
265+
10: 0x7f4027738a19 - main
266+
11: 0x7f402694ab44 - __libc_start_main
267+
12: 0x7f40277386c8 - <unknown>
268+
13: 0x0 - <unknown>
269+
```
270+
271+
A diverging function can be used as any type:
222272

223273
```should_panic
224274
# fn diverges() -> ! {

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,41 @@ let y = TraitObject {
300300
// y.method();
301301
(y.vtable.method)(y.data);
302302
```
303+
304+
## Object Safety
305+
306+
Not every trait can be used to make a trait object. For example, vectors implement
307+
`Clone`, but if we try to make a trait object:
308+
309+
```ignore
310+
let v = vec![1, 2, 3];
311+
let o = &v as &Clone;
312+
```
313+
314+
We get an error:
315+
316+
```text
317+
error: cannot convert to a trait object because trait `core::clone::Clone` is not object-safe [E0038]
318+
let o = &v as &Clone;
319+
^~
320+
note: the trait cannot require that `Self : Sized`
321+
let o = &v as &Clone;
322+
^~
323+
```
324+
325+
The error says that `Clone` is not ‘object-safe’. Only traits that are
326+
object-safe can be made into trait objects. A trait is object-safe if both of
327+
these are true:
328+
329+
* the trait does not require that `Self: Sized`
330+
* all of its methods are object-safe
331+
332+
So what makes a method object-safe? Each method must require that `Self: Sized`
333+
or all of the following:
334+
335+
* must not have any type parameters
336+
* must not use `Self`
337+
338+
Whew! As we can see, almost all of these rules talk about `Self`. A good intuition
339+
is “except in special circumstances, if your trait’s method uses `Self`, it is not
340+
object-safe.”

branches/try/src/libcollections/binary_heap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
//! // 7
113113
//! // +-----------------+
114114
//! // | |
115-
//! // v 1 2 |
115+
//! // v 1 2 | 2
116116
//! // 0 -----> 1 -----> 3 ---> 4
117117
//! // | ^ ^ ^
118118
//! // | | 1 | |

branches/try/src/libcollections/btree/node.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,29 @@ impl<K, V> Node<K, V> {
387387

388388
#[inline]
389389
pub fn as_slices_internal_mut<'b>(&'b mut self) -> MutNodeSlice<'b, K, V> {
390-
// FIXME(#27620): Bad: This relies on structure layout!
391-
unsafe { mem::transmute(self.as_slices_internal()) }
390+
let len = self.len();
391+
let is_leaf = self.is_leaf();
392+
let keys = unsafe { slice::from_raw_parts_mut(*self.keys, len) };
393+
let vals = unsafe { slice::from_raw_parts_mut(*self.vals, len) };
394+
let edges: &mut [_] = if is_leaf {
395+
&mut []
396+
} else {
397+
unsafe {
398+
let data = match self.edges {
399+
None => heap::EMPTY as *mut Node<K,V>,
400+
Some(ref mut p) => **p as *mut Node<K,V>,
401+
};
402+
slice::from_raw_parts_mut(data, len + 1)
403+
}
404+
};
405+
MutNodeSlice {
406+
keys: keys,
407+
vals: vals,
408+
edges: edges,
409+
head_is_edge: true,
410+
tail_is_edge: true,
411+
has_edges: !is_leaf,
412+
}
392413
}
393414

394415
#[inline]

0 commit comments

Comments
 (0)