Skip to content

Commit 91a5a1a

Browse files
committed
Auto merge of #22724 - Manishearth:rollup, r=alexcrichton
Seems to pass `check-stage1`, but I had to tweak some things so it's going through the test gauntlet again.
2 parents f0f7ca2 + ee6f2a1 commit 91a5a1a

Some content is hidden

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

81 files changed

+1375
-852
lines changed

README.md

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,34 @@ Read ["Installing Rust"] from [The Book].
1515
## Building from Source
1616

1717
1. Make sure you have installed the dependencies:
18-
* `g++` 4.7 or `clang++` 3.x
19-
* `python` 2.6 or later (but not 3.x)
20-
* GNU `make` 3.81 or later
21-
* `curl`
22-
* `git`
18+
19+
* `g++` 4.7 or `clang++` 3.x
20+
* `python` 2.6 or later (but not 3.x)
21+
* GNU `make` 3.81 or later
22+
* `curl`
23+
* `git`
2324

2425
2. Clone the [source] with `git`:
2526

26-
$ git clone https://github.com/rust-lang/rust.git
27-
$ cd rust
27+
```sh
28+
$ git clone https://github.com/rust-lang/rust.git
29+
$ cd rust
30+
```
2831

2932
[source]: https://github.com/rust-lang/rust
3033

3134
3. Build and install:
3235

33-
$ ./configure
34-
$ make && make install
36+
```sh
37+
$ ./configure
38+
$ make && make install
39+
```
3540

36-
> ***Note:*** You may need to use `sudo make install` if you do not normally have
37-
> permission to modify the destination directory. The install locations can
38-
> be adjusted by passing a `--prefix` argument to `configure`. Various other
39-
> options are also supported, pass `--help` for more information on them.
41+
> ***Note:*** You may need to use `sudo make install` if you do not
42+
> normally have permission to modify the destination directory. The
43+
> install locations can be adjusted by passing a `--prefix` argument
44+
> to `configure`. Various other options are also supported – pass
45+
> `--help` for more information on them.
4046

4147
When complete, `make install` will place several programs into
4248
`/usr/local/bin`: `rustc`, the Rust compiler, and `rustdoc`, the
@@ -47,27 +53,30 @@ Read ["Installing Rust"] from [The Book].
4753
4854
### Building on Windows
4955
50-
To easily build on windows we can use [MSYS2](http://msys2.github.io/):
56+
[MSYS2](http://msys2.github.io/) can be used to easily build Rust on Windows:
5157
5258
1. Grab the latest MSYS2 installer and go through the installer.
53-
2. Now from the MSYS2 terminal we want to install the mingw64 toolchain and the other
54-
tools we need.
5559
56-
```bash
57-
# choose one based on platform
58-
$ pacman -S mingw-w64-i686-toolchain
59-
$ pacman -S mingw-w64-x86_64-toolchain
60+
2. From the MSYS2 terminal, install the `mingw64` toolchain and other required
61+
tools.
62+
63+
```sh
64+
# Choose one based on platform:
65+
$ pacman -S mingw-w64-i686-toolchain
66+
$ pacman -S mingw-w64-x86_64-toolchain
67+
68+
$ pacman -S base-devel
69+
```
6070
61-
$ pacman -S base-devel
62-
```
71+
3. Run `mingw32_shell.bat` or `mingw64_shell.bat` from wherever you installed
72+
MYSY2 (i.e. `C:\msys`), depending on whether you want 32-bit or 64-bit Rust.
6373
64-
3. With that now start `mingw32_shell.bat` or `mingw64_shell.bat`
65-
from where you installed MSYS2 (i.e. `C:\msys`). Which one you
66-
choose depends on if you want 32 or 64 bit Rust.
67-
4. From there just navigate to where you have Rust's source code, configure and build it:
74+
4. Navigate to Rust's source code, configure and build it:
6875

69-
$ ./configure
70-
$ make && make install
76+
```sh
77+
$ ./configure
78+
$ make && make install
79+
```
7180

7281
## Notes
7382

@@ -92,15 +101,15 @@ There is more advice about hacking on Rust in [CONTRIBUTING.md].
92101

93102
[CONTRIBUTING.md]: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md
94103

95-
## Getting help
104+
## Getting Help
96105

97106
The Rust community congregates in a few places:
98107

99-
* [StackOverflow] - Direct questions about using the language here.
100-
* [users.rust-lang.org] - General discussion, broader questions.
108+
* [Stack Overflow] - Direct questions about using the language.
109+
* [users.rust-lang.org] - General discussion and broader questions.
101110
* [/r/rust] - News and general discussion.
102111

103-
[StackOverflow]: http://stackoverflow.com/questions/tagged/rust
112+
[Stack Overflow]: http://stackoverflow.com/questions/tagged/rust
104113
[/r/rust]: http://reddit.com/r/rust
105114
[users.rust-lang.org]: http://users.rust-lang.org/
106115

@@ -111,7 +120,7 @@ To contribute to Rust, please see [CONTRIBUTING.md](CONTRIBUTING.md).
111120
Rust has an [IRC] culture and most real-time collaboration happens in a
112121
variety of channels on Mozilla's IRC network, irc.mozilla.org. The
113122
most popular channel is [#rust], a venue for general discussion about
114-
Rust, and a good place to ask for help,
123+
Rust, and a good place to ask for help.
115124
116125
[IRC]: https://en.wikipedia.org/wiki/Internet_Relay_Chat
117126
[#rust]: irc://irc.mozilla.org/rust

src/compiletest/compiletest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
268268
logfile: config.logfile.clone(),
269269
run_tests: true,
270270
run_benchmarks: true,
271-
nocapture: false,
271+
nocapture: env::var("RUST_TEST_NOCAPTURE").is_ok(),
272272
color: test::AutoColor,
273273
}
274274
}

src/compiletest/header.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
use std::env;
12+
1113
use common::Config;
1214
use common;
1315
use util;
@@ -125,6 +127,16 @@ pub fn load_props(testfile: &Path) -> TestProps {
125127
true
126128
});
127129

130+
for key in vec!["RUST_TEST_NOCAPTURE", "RUST_TEST_TASKS"] {
131+
match env::var(key) {
132+
Ok(val) =>
133+
if exec_env.iter().find(|&&(ref x, _)| *x == key.to_string()).is_none() {
134+
exec_env.push((key.to_string(), val))
135+
},
136+
Err(..) => {}
137+
}
138+
}
139+
128140
TestProps {
129141
error_patterns: error_patterns,
130142
compile_flags: compile_flags,

src/compiletest/runtest.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ fn run_cfail_test(config: &Config, props: &TestProps, testfile: &Path) {
8989
let proc_res = compile_test(config, props, testfile);
9090

9191
if proc_res.status.success() {
92-
fatal_proc_rec(&format!("{} test compiled successfully!", config.mode)[],
92+
fatal_proc_rec(&format!("{} test compiled successfully!", config.mode)[..],
9393
&proc_res);
9494
}
9595

@@ -398,7 +398,7 @@ fn run_debuginfo_gdb_test(config: &Config, props: &TestProps, testfile: &Path) {
398398
for line in breakpoint_lines.iter() {
399399
script_str.push_str(&format!("break {:?}:{}\n",
400400
testfile.filename_display(),
401-
*line)[]);
401+
*line)[..]);
402402
}
403403
script_str.push_str(&cmds);
404404
script_str.push_str("quit\n");
@@ -553,17 +553,17 @@ fn run_debuginfo_gdb_test(config: &Config, props: &TestProps, testfile: &Path) {
553553
script_str.push_str("set print pretty off\n");
554554

555555
// Add the pretty printer directory to GDB's source-file search path
556-
script_str.push_str(&format!("directory {}\n", rust_pp_module_abs_path)[]);
556+
script_str.push_str(&format!("directory {}\n", rust_pp_module_abs_path)[..]);
557557

558558
// Load the target executable
559559
script_str.push_str(&format!("file {}\n",
560-
exe_file.as_str().unwrap().replace("\\", "\\\\"))[]);
560+
exe_file.as_str().unwrap().replace("\\", "\\\\"))[..]);
561561

562562
// Add line breakpoints
563563
for line in &breakpoint_lines {
564564
script_str.push_str(&format!("break '{}':{}\n",
565565
testfile.filename_display(),
566-
*line)[]);
566+
*line)[..]);
567567
}
568568

569569
script_str.push_str(&cmds);
@@ -689,7 +689,7 @@ fn run_debuginfo_lldb_test(config: &Config, props: &TestProps, testfile: &Path)
689689
.unwrap()
690690
.to_string();
691691

692-
script_str.push_str(&format!("command script import {}\n", &rust_pp_module_abs_path[..])[]);
692+
script_str.push_str(&format!("command script import {}\n", &rust_pp_module_abs_path[..])[..]);
693693
script_str.push_str("type summary add --no-value ");
694694
script_str.push_str("--python-function lldb_rust_formatters.print_val ");
695695
script_str.push_str("-x \".*\" --category Rust\n");

src/doc/intro.md

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -426,39 +426,33 @@ use std::thread::Thread;
426426
fn main() {
427427
let mut numbers = vec![1, 2, 3];
428428
429-
for i in 0..3 {
430-
Thread::spawn(move || {
429+
let guards: Vec<_> = (0..3).map(|i| {
430+
Thread::scoped(move || {
431431
for j in 0..3 { numbers[j] += 1 }
432432
});
433-
}
433+
}).collect();
434434
}
435435
```
436436
437437
It gives us this error:
438438
439439
```text
440-
6:71 error: capture of moved value: `numbers`
441-
for j in 0..3 { numbers[j] += 1 }
442-
^~~~~~~
443-
7:50 note: `numbers` moved into closure environment here
444-
spawn(move || {
445-
for j in 0..3 { numbers[j] += 1 }
446-
});
447-
6:79 error: cannot assign to immutable dereference (dereference is implicit, due to indexing)
448-
for j in 0..3 { numbers[j] += 1 }
449-
^~~~~~~~~~~~~~~
440+
7:29: 9:10 error: cannot move out of captured outer variable in an `FnMut` closure
441+
7 Thread::scoped(move || {
442+
8 for j in 0..3 { numbers[j] += 1 }
443+
9 });
450444
```
451445
452-
It mentions that "numbers moved into closure environment". Because we
453-
declared the closure as a moving closure, and it referred to
454-
`numbers`, the closure will try to take ownership of the vector. But
455-
the closure itself is created in a loop, and hence we will actually
456-
create three closures, one for every iteration of the loop. This means
457-
that all three of those closures would try to own `numbers`, which is
458-
impossible -- `numbers` must have just one owner. Rust detects this
459-
and gives us the error: we claim that `numbers` has ownership, but our
460-
code tries to make three owners. This may cause a safety problem, so
461-
Rust disallows it.
446+
It mentions that "captured outer variable in an `FnMut` closure".
447+
Because we declared the closure as a moving closure, and it referred
448+
to `numbers`, the closure will try to take ownership of the
449+
vector. But the closure itself is created in a loop, and hence we will
450+
actually create three closures, one for every iteration of the
451+
loop. This means that all three of those closures would try to own
452+
`numbers`, which is impossible -- `numbers` must have just one
453+
owner. Rust detects this and gives us the error: we claim that
454+
`numbers` has ownership, but our code tries to make three owners. This
455+
may cause a safety problem, so Rust disallows it.
462456
463457
What to do here? Rust has two types that helps us: `Arc<T>` and `Mutex<T>`.
464458
*Arc* stands for "atomically reference counted". In other words, an Arc will
@@ -480,14 +474,14 @@ use std::sync::{Arc,Mutex};
480474
fn main() {
481475
let numbers = Arc::new(Mutex::new(vec![1, 2, 3]));
482476
483-
for i in 0..3 {
477+
let guards: Vec<_> = (0..3).map(|i| {
484478
let number = numbers.clone();
485-
Thread::spawn(move || {
479+
Thread::scoped(move || {
486480
let mut array = number.lock().unwrap();
487481
array[i] += 1;
488482
println!("numbers[{}] is {}", i, array[i]);
489483
});
490-
}
484+
}).collect();
491485
}
492486
```
493487
@@ -516,8 +510,10 @@ numbers[1] is 3
516510
numbers[0] is 2
517511
```
518512
519-
Each time, we get a slightly different output, because each thread works in a
520-
different order. You may not get the same output as this sample, even.
513+
Each time, we can get a slithtly different output because the threads
514+
are not quaranteed to run in any set order. If you get the same order
515+
every time it is because each of these threads are very small and
516+
complete too fast for their indeterminate behavior to surface.
521517
522518
The important part here is that the Rust compiler was able to use ownership to
523519
give us assurance _at compile time_ that we weren't doing something incorrect
@@ -539,13 +535,13 @@ safety check that makes this an error about moved values:
539535
use std::thread::Thread;
540536
541537
fn main() {
542-
let vec = vec![1, 2, 3];
543-
544-
for i in 0..3 {
545-
Thread::spawn(move || {
546-
println!("{}", vec[i]);
538+
let numbers = vec![1, 2, 3];
539+
540+
let guards: Vec<_> = (0..3).map(|i| {
541+
Thread::scoped(move || {
542+
println!("{}", numbers[i]);
547543
});
548-
}
544+
}).collect();
549545
}
550546
```
551547

src/doc/reference.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,9 @@ This last example is different because it is not possible to use the suffix
515515
syntax with a floating point literal ending in a period. `2.f64` would attempt
516516
to call a method named `f64` on `2`.
517517

518+
The representation semantics of floating-point numbers are described in
519+
["Machine Types"](#machine-types).
520+
518521
#### Boolean literals
519522

520523
The two values of the boolean type are written `true` and `false`.
@@ -3554,7 +3557,8 @@ Tuple types and values are denoted by listing the types or values of their
35543557
elements, respectively, in a parenthesized, comma-separated list.
35553558

35563559
Because tuple elements don't have a name, they can only be accessed by
3557-
pattern-matching.
3560+
pattern-matching or by using `N` directly as a field to access the
3561+
`N`th element.
35583562

35593563
An example of a tuple type and its use:
35603564

@@ -3563,6 +3567,7 @@ type Pair<'a> = (i32, &'a str);
35633567
let p: Pair<'static> = (10, "hello");
35643568
let (a, b) = p;
35653569
assert!(b != "world");
3570+
assert!(p.0 == 10);
35663571
```
35673572

35683573
### Array, and Slice types

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Rust has two distinct terms that relate to the module system: *crate* and
1212
*module*. A crate is synonymous with a *library* or *package* in other
1313
languages. Hence "Cargo" as the name of Rust's package management tool: you
1414
ship your crates to others with Cargo. Crates can produce an executable or a
15-
shared library, depending on the project.
15+
library, depending on the project.
1616

1717
Each crate has an implicit *root module* that contains the code for that crate.
1818
You can then define a tree of sub-modules under that root module. Modules allow

0 commit comments

Comments
 (0)